Wie sortiert man ein Ergebnis, ohne echte Datenbank-Felder?



  • Hallo zusammen

    Ich grüble und grüble, wie man ein Ergebnis sortieren kann, in dem die Datenbank-Feldnamen eigentlich Zeilen einer anderen Tabelle wiederspiegeln. Folgendes Szenario:

    Es gibt folgende Tabellen:

    - Anzeigen (Die eigentlichen Anzeigen mit den nötigsten Felder)
    - AnzeigenAttribute (Hier sind als Zeilen die Attribute für die Anzeigen. Z.B. Verkaufspreis)
    - AttributWerte (Hier sind die Attributwerte für die AnzeigenAttribute. Hier kommen also die vom User hinzugefügten Zahlen und String Werte rein, verbunden mit jeweils einer Zeile aus der AnzeigenAttribute Tabelle.

    Aufgebaut sind die Tabellen in etwa so:

    [b]Anzeigen[/b]
     id
     besitzer_id
     ...
     ...
     ...
     ...
    
    [b]AnzeigenAttribute[/b]
     id
     attribute_name
    
    [b]AttributWerte[/b]
     id
     anzeigen_id
     besitzer_id
     attribute_name_id
     wert_int
     wert_string
    

    Wenn ich nun ein SELECT mache und die Tabellen AnzeigenAttribute und AttributWerte mit einem JOIN miteinbeziehe, ergibt das wegen der Algebralogik dann so viele Zeilen wie notwendig sind, bis alles miteinader verbunden ist. Soweit so gut. Dies löse ich dann mit einem GROUP_CONCAT (damit ich von allen notwendigen Sachen alles in einem Feld habe) und am Ende noch mit GROUP BY.

    Die Frage ist nun aber, wie kann ich das Ergebnis anhand der AttributWerte (Strings oder Zahlenwerte) in Assoziation mit AnzeigenAttribute sortieren lassen? Die "Datenbank-Feldrepräsentations-Tabelle" (also AnzeigenAttribute) soll dazu benutzt werden, dass die Ergebnisse korrekt anhand der AttributWerte sortiert sind.

    z.B.: Ich will das es durch den Verkaufspreis sortiert wird. 'Verkaufspreis' ist nun kein direktes Feld einer Tabelle, wie man es kennt, sondern eben ein Eintrag in AnzeigenAttribute. Das ganze soll nun aufsteigend sortiert werden und dabei soll dann der vom Benutzer eingetragene Wert (aus Tabelle AttributWerte) sortiert dargestellt werden.

    Ich hoffe ihr könnt mir helfen.



  • Das ist ein schönes Beispiel für das "Entity-Attribute-Value"-Modell, das auch oft als ein Antipattern bezeichnet wird. Du bist damit zwar sehr flexibel, was das Speichern angeht, aber komplexe Abfragen werden damit schwierig bis unmöglich.



  • Danke für Deinen Beitrag. Habe ich nun in meinem Fall die Arschkarte gezogen? Bitte nicht 🕶



  • Hi,

    entweder bei order by nicht die Feldnamen, sondern die Spaltennummer angeben, also z.B. ... order by 3,5,2;

    oder Du machst über die Abfrage noch eine Abfrage
    z.B. select * from (select * from ... ) order by Feld...;

    Gruß Mümmel


Anmelden zum Antworten