SQL-Select ergibt andere Sortierung wenn mehr Felder abgefragt werden

Thema wurde von Kai Stejuhn, 2. Januar 2020 erstellt.

  1. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Vielleicht kann mir hier jemand weiterhelfen. Ich mache ein SQL-Select mit folgenden Parametern

    SELECT additional_field_id FROM additional_fields WHERE item_type = "product"

    Das Ergebnis sieht dann so aus (nur die Werte von Additional_field_id) : 30,19,20,26,28,27,21,29,25

    Wenn ich nun den Select erweitere um das Feld multilingual, also

    SELECT additional_field_id, multilingual FROM additional_fields WHERE item_type = "product"

    Dann sieht das Ergebnis so aus (nur die Werte von Additional_field_id) : 19, 20, 21, 25, 26, 27, 28, 29, 30

    Jemand eine Idee oder eine Ahnung warum das so ist?
     
  2. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.748
    Danke vergeben:
    137
    So lange bei einem SELECT kein ORDER BY angegeben ist, darf das Datenbanksystem (hier: MySQL) frei entscheiden, in welcher Reihenfolge es die Reihen zurückliefert, das ist in der Praxis also völlig von internen Implementierungsdetails des Datenbanksystems abhängig. Es kommt also drauf an, ob/welche Indizes verwendet werden, welche Teile einer Tabelle gerade in irgendeinem Cache liegen etc. pp.
     
  3. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Okay, das ist nicht gut.

    Den Select habe ich aus der /admin/html/compatibility/product/additional_fields.inc.php. Dort werden die Zusatzfelder "aufgebaut". Leider kommen die nun nicht in der Reihenfolge, in der ich die Felder eingegeben habe, was dann mitunter ziemlich blöd aussieht.

    Ist das ein Bug oder ein Feature?
     
  4. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.309
    Danke vergeben:
    2.208
    Ich verstehe die Frage inhaltlich nicht. Solange du nur eine Spalte abfragst sortiert MySQL halt per Default, nimmste weitere rein nicht mehr. Dann sortier doch halt wieder explizit.
     
  5. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Ich habe mich wohl nicht ganz klar ausgedrückt. Das Problem besteht mit den Zusatzfeldern bei den Artikeln. Wenn ich dort im Artikel z. B. die Felder Herkunft, Geschmack und Jahrgang anlege, dann möchte ich dass diese Felder auch in dieser Reihenfolge im Artikel angezeigt werden. Das ist aber bei mir nicht der Fall. Die Reihenfolge wird bei der Ausgabe in der Produktansicht im Frontend verändert und wenn ich den Artikel im Backend nochmal aufrufe ist die Reihenfolge auch vertauscht und nicht mehr so wie ich die Felder eingegeben habe.

    Bisher bin ich davon ausgegangen, das die Zusatzfelder immer in der Reihenfolge der Eingabe erscheinen, das ist aber nicht der Fall und ich kann auch keine Logik feststellen wie der Select die Felder zusammenbaut. Ein Overload ist nicht möglich, da dort keine Klasse genutzt wird.

    Daher kam meine Frage Bug oder Feature. Ich baue da noch nichts neues, ich möchte nur die Gambio-Standardfunktion nutzen, was für mich im Augenblick schlecht ist.
     
  6. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    Bei mir (Testshop auf dem PC) werden die Felder immer so angezeigt, wie ich sie ursprünglich mal angelegt habe.
    Version 3.14.
     
  7. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Ich habe das bei einen anderen Shop auch so gesehen, aber bei mir wird es anders angezeigt. Das passiert bei einen 3.8, 3.14 und auch bei einer 3.15 Version.

    Ich habe ja gedacht, dass es am SQL-Server liegt und es dafür einen "Trick" gibt, damit die Reihenfolge so bleibt. Merkwürdigerweise kommt die "richige Sortierung" wenn ich das Feld multilingual in die Abfrage mit einbaue, zumindest beim phpMyAdmin.
     
  8. Wilken (Gambio)

    Wilken (Gambio) Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    18.737
    Danke erhalten:
    7.309
    Danke vergeben:
    2.208
    Ich blick da nicht durch, das ist mir so zu theoretisch. Ich verstehe da kommt aus irgendwelchem Code irgendwo was raus nicht sortiert ist, das vermutlich bei einer selbst erweiterten Abfrage und Tabelle. Aber soviel Kontext, dass ich verstehen würde wo warum kein sortby möglich ist, krieg ich hier so trocken nicht raus.
     
  9. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Okay, jetzt nochmal ganz langsam.

    Ich habe einen Artikel (z. B. Einen Wein) für den ich im Adminbereich bei der Bearbeitung der Artikeldaten drei Zusatzfelder, in der Reihenfolge: Herkunft, Geschmack und Jahrgang, anlege. Ich nutze hier nur die Standardfunktion die von Gambio vorgesehen ist.

    Wenn ich diesen Artikel nun speichere und mir dann die Felder erneut in der Bearbeitung anschaue, dann ist die Reihenfolge vertauscht. Wie gesagt, ich habe nur die Felder angelegt und schaue nun nochmal die Felder an. Ich habe hier keine eigene Abfrage oder eigene Tabellen genutzt.

    Wenn ich nun im Frontend den Artikel aufrufe, dann werden mir hier die Felder genauso vertauscht angezeigt wie im Backend. Auch hier ist nur die Anzeige in der Artikelanzeige gemeint, die von Gambio bereitgestellt wird. Keine weitere Abfrage oder andere Tabelle.

    Jetzt kommt der theoretische Teil. Ich habe geschaut, wo die Anzeige zusammengebaut wird und habe dann die "/admin/html/compatibility/product/additional_fields.inc.php" als Ort des Aufbaus gefunden. Wenn ich nun den dortigen Select nehme und in phpMyAdmin eingebe, dann kommt die Reihenfolge heraus, welche im Shop auch raus kommt, also die "Falsche". Wenn ich nun zum Select das Feld "multilingual" hinzufüge, dann kommt das Ergebnis in der Reihenfolge der Eingabe.

    Da der Aufbau nicht über eine Klasse führt, kann ich da auch nicht überladen, wobei ich das auch nicht für sinnvoll halte, das ich eine Funktion von Gambio überlade, nur weil die nicht das mach was man erwartet. Marco hat in #2 sehr schön erklärt, wo das Problem liegt und darum habe ich die Frage Bug oder Feature gestellt. Um auch diese Frage weiter aufzuschlüsseln: Ist es von Gambio gewollt, das man dort mit einen Ergebnis(Reihenfolge) arbeitet, was vom Datenbanksystem bestimmt wird?
     
  10. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.748
    Danke vergeben:
    137
    #10 Anonymous, 3. Januar 2020
    Zuletzt bearbeitet: 3. Januar 2020
    Die Zusatzfelder sind eine Menge, keine ReiheFolge: Die Reihenfolge ist unbestimmt.
     
  11. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Macht das Leben nicht leichter aber wenn es so gewollt ist, dann muss ich damit leben und arbeiten.
     
  12. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.122
    Danke vergeben:
    947
    Leg doch eine eigene Sortierung fest in der Abfrage, dann ist es einheitlich?
     
  13. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Wo soll ich eine eigene Sortierung festlegen?
     
  14. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.122
    Danke vergeben:
    947
    Geht es nicht mehr darum? Könntest doch in Zeile 13 einfach eine Sortierung nach additional_field_id anhängen? Oder die additional_field_description über die additional_field_id joinen und dann nach name sortieren? Nicht updatesicher, klar. Vielleicht verstehe ich dein Anliegen auch falsch? Was ist denn der Usecase, willst du Optik im Frontend vereinheitlichen für den Kunden oder im Admin was automatisieren oder warum müssen die Felder eine feste Reihenfolge haben?
     
  15. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.403
    Danke erhalten:
    707
    Danke vergeben:
    92
    Nett gemeint, aber den Original-Code zu verändern, das ist für mich ein absolutes NoGo. Wenn ein Overload möglich gewesen wäre, dann hätte ich das evtl. gmacht aber so nicht, dann lasse ich es wie es ist und arbeite damit.

    Ich will die Zusatzfelder auch an anderen Stellen ausgeben und da hatte ich mit einer eigenen Funktion gearbeitet. Da ich dachte dass die Felder immer in der Reihenfolge der Eingabe ausgegeben werden, habe ich die Ausgabe dort dann entprechend gestaltet. Das muss ich nun halt anders lösen, dann ist die Anzeige ja wieder überall gleich. Das die Sortierung dann nicht unbedingt so ist wie erstmalig eingegeben, das ist dann halt so.
     
  16. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. April 2019
    Beiträge:
    82
    Danke erhalten:
    15
    Danke vergeben:
    14
    Gambio v3.15.1.2
    /system/classes/products/additionalFieldControl.inc.php

    SELECT .. FROM .. WHERE ..
    Zeile 54
    "ORDER BY additional_field_id"
    anhängen.

    So habe ich eine Sortierung hinbekommen.
    Eventuell der Vorschlag an das Gambio Team, das prinzipiell so zu gestalten.

    @Marco (Gambio)
    Was soll ich mit einer Menge? bzw. gibt es einen Grund dafür? (Also werden an anderer Stelle u.U. Mengen miteinander verglichen oder verknüpft?)
    Ich denke 99% der User arbeiten mit einer Reihenfolge und hätten die dann je Produkt auch gerne immer in der selben Sortierung. (Wie Kai und ich auch)
    Habe das Thema jetzt nochmal aufgegriffen, weil ich denke, das Zusatzfelder eine Option zu den Attributen sind,
    die ja bekanntlich nicht Ex- oder importiert werden können. Mit den Zusatzfeldern geht das aber! Zumindest den Export habe ich schon gemacht und sie stehen in der CSV...

    Und selbst wenn man evtl. Mengen vergleichen oder verknüpfen will wäre die Sortierung dann ja auch nicht hinderlich!

    Wenn schon keine Sortiermöglichkeit über ein Extra Eingabefeld, dann aber doch bitte wenigstens nach Eingabe.

    Wäre eine halbe Zeile code.
    Eine saubere Lösung mit diesen overloads wäre mir auch lieber, da muss ich mich aber erstmal reinfiddeln.
    Woher hast Du die Info, dass das mit overloads nicht geht in dem Fall. Habe hier in den Antworten nichts darüber gelesen?
    Bis dahin packe ich die inc.php in einen exra-ordner auf dem Server und spiel sie nach einem update wieder ein. grummel.

    Ich wollte die Zusatzfelder auch an anderer Stelle ausgeben lassen. Als "Tab" neben der Beschreibung.
    Das ist mit dem Theme oder Templatesystem von gambio aber scheinbar nicht so leicht...
    Muss ich da jetzt eine eigene Function für basteln? Die ist doch da. Und das Ergebnis wird doch auch ausgegeben
    oben rechts im Preis-block? Aber das ist wohl eine neues Thema...sorry.

    wünsche allen einen schönen Tag
     
  17. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.656
    Danke erhalten:
    1.261
    Danke vergeben:
    300
    Hi, man kann die Funktionen "get_field_names_by_item_type" und "get_fields_by_item_id_and_item_type" in der Datei "/system/classes/products/AdditionalFieldControl.inc.php" problemlos überladen und statt der Originalfunktion nutzen.
    Wenn das als getrenntes Modul dann im GXModules liegt wird das keine Originaldateien überschreiben und bleibt bei Update erhalten.
     
  18. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    Grundsätzlich sollte man m.M.n immer explizit sortieren. Man weiß nie was am anderen Ende der Leitung dran hängt - sei es eine betagte MySQL, eine MariaDB oder sonst etwas. Auch weiß man nicht ob wer an den Indizes geschraubt hat um Performance zu verbessern.
    Durch Angabe von ORDER BY hat man volle Kontrolle mit man es sich wünscht. Man sollte aber bei mehrfach Sortierungen wie z.B. ORDER BY products_id, additional_field_id jeweils bei den Feldern explizit auch die Sortierrichtung (ASC, DESC) mit angeben, damit diese nicht durch die Tabellenstruktur vorgegeben wird.

    Also besser: ... ORDER BY products_id asc, additional_field_id asc
     
  19. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. April 2019
    Beiträge:
    82
    Danke erhalten:
    15
    Danke vergeben:
    14
    Hallo Till,
    klingt super, danke.
    Werde ich mich demnächst mal dran versuchen an dem überladen. Schön, dass es das überhaupt gibt,
    die Möglichkeit eigene Funktionen updatesicher zu implementieren. Großes Lob! Danke.
    Hm, hat er irgendwie nicht abgeschickt meine Antwort?