Anleitung Hilfreiche SQL-Befehle

Thema wurde von Petra, 28. April 2015 erstellt.

  1. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    115
    Danke vergeben:
    20


    Mit UPDATE und INNER JOIN ... aber hab grad Mittagspause von daher, gibt es die Antwort erst nach der Pause :D
     
  2. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    So:


    insert into feature_set_to_products (feature_set_id,products_id)
    select gender, products_id from products_item_codes


    Ich habe zwar keine keine befüllten Tabellen, aber so sollte es gehen.


    Ich nehme daher an, dass in Feld Gender in products_item_codes 6 bzw. 7 steht.
    D.h. mit der INSERT-Abfrage, werden ALLE Artikel (!!!) aus products_item_codes in feature_set_to_products eingefügt.
    Wenn mehr als 6 und 7 drinnen steht, dann muß Du im SELECT doch eine Eingrenzung machen, ebenso, wenn es nur bestimmte Artikel sein sollen, z.B. select gender, products_id from products_item_codes where gender IN('6','7') AND products_id IN(8334, 5262).


    select gender, products_id from products_item_codes where gender IN('6','7') falls gender TEXT ist sonst IN (6,7)


    Probiere es mal mit den zwei Artikeln, dann siehst Du ja das Ergebnis.
     
  3. NK76530

    NK76530 Erfahrener Benutzer

    Registriert seit:
    21. April 2012
    Beiträge:
    682
    Danke erhalten:
    27
    Danke vergeben:
    152
    #83 NK76530, 25. Februar 2016
    Zuletzt bearbeitet: 25. Februar 2016
  4. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    Vielleicht etwas präziser.
    Z.B. Welches SQL-Script funktioniert nicht?
    Was bedeutet "es funktioniert nicht"? Kein geändertes Ergebnis? Fehlermeldung?
    Wo führst Du das Script aus?
     
  5. ek-support

    ek-support Aktives Mitglied

    Registriert seit:
    2. Oktober 2015
    Beiträge:
    42
    Danke erhalten:
    3
    Danke vergeben:
    12
    Hab es noch nicht ganz, komm nicht weiter:
    '6' = Herren
    '7' = Damen

    HTML:
    SELECT gender, products_id FROM products_item_codes WHERE gender = "Damen"
    SELECT gender, products_id FROM products_item_codes WHERE gender = "Herren"
    
    Die products_id´s die dann erkannt werden sollen mit:
    HTML:
    INSERT INTO `feature_set_to_products` VALUES ('6','8334'),('7','5262');
    
    hinzugefügt werden.

    Stimmt nicht:
    HTML:
    INSERT INTO feature_set_to_products (feature_set_id, products_id)
      SELECT gender, products_id 
      FROM products_item_codes AS p
      LEFT JOIN feature_set_to_products AS f ON p.gender = "Damen"
      SET f.feature_set_id = '6', f.products_id = p.products_id
    
     
  6. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    #86 tiger955, 26. Februar 2016
    Zuletzt bearbeitet: 26. Februar 2016
    @Enrico:
    Du brauchst KEIN LEFT JOIN im SELECT.

    Ich habe Dir die Lösung geschrieben.
    Daraus nimmst du zum Test nur das SELECT. Und wenn dir die Ergebnismenge passt, dann setzt du das INSERT... davor, das war es.
    Im Select grenzt du nur die Menge ein, die eingefügt werden soll. Ausserdem würde ich immer auf nummerische Werte prüfen (6,7) und nie auf Text. Zudem müßte 'Damen' und nicht "Damen" stehen.


    SET gibt es nur in einer UPDATE-Anweisung, NICHT in einer INSERT-Anweisung.


    Durch das SELECT holst Du dir die Werte, die Du brauchst aus der Quelle und fügst sie mit INSERT ins Ziel ein.


    Die gleiche Reihenfolge der selektierten Felder mußt Du in der INSERT Anweisung verwenden, daher muß die Anzahl der SELECT und INSERT Felder übereinstimmen.


    Wenn 6 und 7 als Feldinhalte aus dem SELECT kommen, brauchst Du sie nicht mehr explizit anführen, sondern nur den Feldnamen. Ich gehe auch davon aus, dass der Felddatentyp in der products_item_codes und in der feature_set_to_products gleich ist (da ID fast IMMER eine fortlaufende Integer-Zahl ist), daher wäre zudem das INSERT nicht mit '6', sondern nur mit 6. '6' ist Text, während 6 Zahl ist.
     
  7. ek-support

    ek-support Aktives Mitglied

    Registriert seit:
    2. Oktober 2015
    Beiträge:
    42
    Danke erhalten:
    3
    Danke vergeben:
    12
    @tiger955:
    Ich glaube da ist was durcheinander gekommen. Folgende Select Anweisung ermittelt mir die 'Damen' Artikel:

    select gender, products_id from products_item_codes where gender = 'Damen'

    Als nächstes muss aber in die Tabelle: feature_set_to_products (feature_set_id, products_id) das neue Wertepaar rein. Mit z.B. ('6', '6789'), wie mach ich das jetzt?
     
  8. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    Ich kann allen nur folgenden Tipp geben, wenn es um Tabellen, Daten, Datenfeld und SQL-Script (zum Üben) geht:


    Macht Euch eine Sicherung Eures Shops und sichert Euch die gesamte Datenbank lokal auf den Rechner.


    Dann installiert Euch die gratis MySQL-Workbench (https://www.mysql.de/products/workbench) und öffnet dort eine Kopie der Sicherung.


    Dann seht Ihr in der Tabellenstruktur die Felder, die Felddatentypen und alles, was in Eurem Webshop-Datenbank enthalten ist. Vor allem auch die Daten.


    Dann kann man dort sehr einfach und risikolos SQL-Scripts ausprobieren und vor allem das Ergebnis betrachten.


    Ein richtiges, funktionierendes Script dann aus der Workbench einfach kopieren und im "SQL-Fenster" im Webshop ausführen.
    Achtung: da sich die Daten im Webshop zwischenzeitlich inhaltlich verändert haben könnten, immer schauen, ob Eure Parameter auch dann am Server alle Daten "erwischen"!!
     
  9. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    115
    Danke vergeben:
    20
    @ek-support: Wenn du Einträge aktualisieren möchtest die aber über mehrere Tabellen verteilt sind, dann musst du aus all diesen Tabellen eine "neue generieren".

    Beispiel:
    Du möchtest Tabelle-"products_item_codes" in Verbindung mit der Tabelle "feature_set_to_products" aktualisieren, ändern, oder was auch immer..

    Dann musst du die beiden Tabellen mit einer SELECT und INNER JOIN Anweisung zu einer "verknüpfen"

    SELECT Spaltenname_1, Spaltenname_2, usw..
    FROM Tabelle_1
    INNER JOIN Tabelle_2
    ON Tabelle_1.Spalten_Name=Tabelle_2.Spalten_name; (In der Regel nimmt man dafür die ID also products_id)

    Nun hast du aus den zwei Tabellen eine "neue generiert" mit der du nun rum spielen kannst.
     
  10. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47

    Ich schreibe es nun zum dritten Mal:


    Das Wertepaar ('6', '6789') holst Du dir mit der SELECT-Anweisung, sowie 1000e andere Wertepaare, (6,1234), (6,1235), etc.
    Wobei ich etwas bezweifle, dass das Wertepaar ('6','6789') ist.
    Wie ich schon schrieb, ID's sind zumeist Zahlen und keine Texte !!!!!
    Daher wären die Werte in den Wertepaaren nicht unter Anführungszeichen zu setzen. Aber auch das ist egal, wenn Du das selektierte Feld in das entsprechende Feld in der Zieltabelle überführt und BEIDE Felddatentypen gleich sind.


    Warum probierst Du nicht einfach die SELECT-Anweisung, dann siehst Du doch, was Du zurück bekommst.
     
  11. ek-support

    ek-support Aktives Mitglied

    Registriert seit:
    2. Oktober 2015
    Beiträge:
    42
    Danke erhalten:
    3
    Danke vergeben:
    12
    #91 ek-support, 26. Februar 2016
    Zuletzt bearbeitet: 26. Februar 2016
    Ich will die Wertepaare erzeugen, welche noch nicht vorhanden sind.
    Damen = '7'
    Herren = '6'

    HTML:
    SELECT  p.products_id, p.gender, f.feature_set_id, f.products_id
    FROM products_item_codes AS p 
    LEFT OUTER JOIN feature_set_to_products AS f 
    ON p.products_id = f.products_id
    
    Ergebniss des Select:
    dd.jpg
     
  12. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    #92 tiger955, 26. Februar 2016
    Zuletzt bearbeitet: 26. Februar 2016
    Lassen wir es, Du verstehst es nicht....


    WO FINDEST DU WOHL DEINE 1000en ARTIKEL???


    Doch nur in der Tabelle products oder products_item_codes!!!


    Mehr gibt es nicht.
    Also hast Du bereits einen Teil des Wertepaares!


    Und den anderen Wert (6 oder 7) gibt es wohl auch als Eintrag aus der Tabelle, wo Gender drinnen ist, denn dort sollte neben Gender auch eine ID drinnen sein (ich kann eben nicht genau sagen, weil ich keinen Filter gesetzt habe). Du als User kannst aber keine ID setzen, auch keine filter-ID!!


    Und somit kannst Du Deine Wertepaare aus dem SELECT holen. Könntest du alles sehen, wenn du einfach das select machst, wie ich dir schon 3 mal geschrieben habe.
     
  13. ek-support

    ek-support Aktives Mitglied

    Registriert seit:
    2. Oktober 2015
    Beiträge:
    42
    Danke erhalten:
    3
    Danke vergeben:
    12
    #93 ek-support, 26. Februar 2016
    Zuletzt bearbeitet: 26. Februar 2016
    1. Manuell Artikel-Filter erstellen für Geschlecht(gender) in Gambio-Backend, anschließend sollen alle Artikel, welche schon einen Eintrag in der `products_item_codes.gender` haben diesen Filter erhalten.
    2. Nachschauen welche Werte Gambio in der `feature_set_to_products` vergibt, bei mir:
      6 = Herren
      7 = Damen
    3. Mit SELECT nachschauen welche Artikel noch keinen gender(Filter) haben.
      HTML:
      SELECT  p.products_id, p.gender, f.feature_set_id, f.products_id
      FROM products_item_codes AS p
      LEFT OUTER JOIN feature_set_to_products AS f ON p.products_id = f.products_id
    4. Mit INSERT die richtigen Werte der Tabelle `feature_set_to_products` hinzufügen
      HTML:
      INSERT INTO feature_set_to_products (feature_set_id, products_id)
      SELECT CASE WHEN p.gender='Damen' THEN 7 WHEN p.gender='Herren' THEN 6 ELSE NULL END, p.products_id
      FROM products_item_codes p
      LEFT JOIN feature_set_to_products AS f ON p.products_id = f.products_id
      WHERE p.gender IN ('Damen', 'Herren') AND f.products_id IS NULL
    5. Mit Nr. 3 nochmal prüfen und freuen.
     
  14. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    Na, so leicht kann es gehen.

    Nur die Beschreibung, so wie du das Problem beschrieben hast, ließ keinen Schluss zu auf das, was du wirklich wolltest.

    Und '6' (Herren) ist eben falsch. 6 wäre richtig dargestellt, denn 6 und 7 ist eine Zahl und KEIN Texteintrag.

    Bei SQL muss man eben pingelig sein.., denn '6' hättest Du nicht als feature_set_id inserten können.
     
  15. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    Hallo, ich möchte

    1. alle Kunden aus einer Kundengruppe löschen - für immer.
    2. Dann möchte ich alle Kunden aus einer Gruppe in eine andere verschieben.
    3. Und dann möchte ich noch Kunden die sich das letzte Mal 2009 angemeldet haben löschen.

    So, meine Lieben, das wären dann mal 3 Befehle *ggg*
     
  16. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    Petra, in einer relationalen Datenbank kann man nicht einfach Einträge aus einer Tabelle löschen. Technisch schon, aber die Auswirkungen sind vermutlich schwerwiegend.
    Wenn du Kunden löscht, hängen deren Bestellungen, etc. in der Luft. Viele Einträge sind derart mieinander verknüpft, dass man alle "Relationen" kennen muss, um das sauber zu machen.

    Ich sehe auch keine Notwendigkeit, die Daten zu löschen, denn die Performance wird wohl nicht beeinflusst, sofern du nicht 100.000de Datensätze löscht.

    Wenn du tatsächlich ein Performance-Problem hast, würde ich eher die DB neu aufbauen - ohne Kunden, ohne Bestellungen, nur mit Artikel.
     
  17. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    Darum geht es nicht. Es geht darum, dass ich den Shop komplett neu aufgesetzt habe und die Kunden, Bestellungen und Kundengruppen aus der alten Datenbank übernommen habe. Nun bekomme ich ständig SQL-Fehler, kann keine Artikel mehr anlegen usw. weil er bei den Kundengruppen eben diese SQL Fehler auswirft.
     
  18. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    Außerdem, wenn es solche Probleme bereitet, warum kann ich dann Gastkonten löschen. Die Bestellungen sind noch da mit allem Zipp und Zapp.
     
  19. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Hallo Petra,
    hast Du für den Import den Import-Assistenten genommen, oder einfach die Tabellen aus der alten DB in die neue übertragen?
     
  20. tiger955

    tiger955 Erfahrener Benutzer

    Registriert seit:
    30. März 2015
    Beiträge:
    226
    Danke erhalten:
    9
    Danke vergeben:
    47
    #100 tiger955, 3. März 2016
    Zuletzt bearbeitet: 3. März 2016
    Ich kenne die Beziehungen der einzelnen Tabellen nicht auswendig. Es kann durchaus sein, dass im Code beim Löschen von Konten auch aus anderen Tabellen Datensätze gelöscht werden. Dann ist es so im Programm vorgesehen. Aber DIREKT aus Tabellen zu löschen, OHNE alle Beziehungen zu kennen ist gefährlich. Eventuell ist das auch die Ursache der jetzigen Probleme nach dem Neuaufsetzen des Shops.

    Ich würde mir mal eine Kopie einer Sicherung in MySQL Workbench ansehen, durch alle Tabellen nach customers_id (=Kundennummer) suchen und dann an den Tabellen anhand der Namen überlegen, ob das gelöscht werden kann.

    Ich denke aber, dass ein neuer Shop, nur mit Artikel, settings, etc. ohne Kunden einfacher wäre. Zwei Browser-Fenster, evt. Auf zwei Bildschirmen, dann ist es zügig neu aufgesetzt.

    DELETE FROM tabellenname WHERE bedingung.... Löscht Daten, welche der Bedingung entsprechen.
    Z.b. Where customers_id between 100 and 200.