Nach mehreren Spalten sortieren?

gerthsen

Grünschnabel
Hallo!

Ich habe ein Problem bei dem ich einfach nicht weiterkomme ... Ich hoffe ihr könnt mir weiterhelfen!

Es handelt sich um eine Tabelle, sagen wir mal über CDs. Jetzt möchte ich bei jeder CD eintragen können wenn sie eine Auszeichnung bekommen hat. Drei Auszeichnungen genügen mir, daher gibt es hier auch keine m:n Beziehung. Ich habe unter anderem die Felder Auszeichnung1_ID, Auszeichnung1_Jahr, Auszeichnung2_ID, Auszeichnung2_Jahr, Auszeichnung3_ID und Auszeichnung3_Jahr. Für die Auszeichnungen habe ich eine eigene Tabelle, die IDs dieser Auszeichnungen werden eben in die ID Felder der CD Tabelle eingetragen! Es gibt mehr als drei Auszeichnungen, aber es reicht mir wenn man drei davon eintragen kann. In welches der drei Auszeichnungsfelder man welche Auszeichnung einträgt ist egal.

Soweit hoffentlich verständlich ... JETZT KOMMT DAS PROBLEM
Ich möchte eine Abfrage nach einer bestimmten Auszeichnung machen und diese nach Jahr sortieren. Das Problem ist jetzt, dass die gleiche Auszeichnung nicht immer in Auszeichnung1_ID steht, sondern genausogut in Auszeichnung2_ID oder Auszeichnung3_ID eingetragen worden sein kann...

Ich kann also nicht einfach folgendes machen:

select * from CD, AUSZEICHNUNG AS A
where
CD.Auszeichnung1_ID=A.ID AND
CD.Auszeichnung2_ID=A.ID AND
CD.Auszeichnung3_ID=A.ID AND
A.Name like "MTV MUSIC AWARD"
ORDER BY Auszeichnung1_Jahr

Denn nach was soll ich sortieren? Ich weiß ja nicht in welcher der drei Spalten überall "MTV MUSCI AWARD" eingetragen wurde!?

IST MIR NOCH ZU HELFEN? :eek:)

Danke
Arno
 
select * from CD, AUSZEICHNUNG AS A
where
CD.Auszeichnung1_ID=A.ID OR
CD.Auszeichnung2_ID=A.ID OR
CD.Auszeichnung3_ID=A.ID AND
A.Name like "MTV MUSIC AWARD"
ORDER BY A.Name

währe eine Möglichkeit

select * from cd , Auszeichnung as a where a.id in (CD.Auszeichnung1_id,CD.Auszeichnung2_id,CD.Auszeichnung3_id) and A.Name like "MTV MUSIC AWARD"
ORDER BY A.Name
eine andre

oder ich habe die Frage nicht verstanden :-(
 
Hi, probier doch mal die Abfrage der 3 Auszeichnungen per UNION zu verknüpfen, also

Code:
SELECT Auszeichnung1_ID ID, Auszeichnung1_Jahr Jahr, ... From ... WHERE ...
UNION
SELECT Auszeichnung1_ID, Auszeichnung1_Jahr, ... From ... WHERE ...
UNION
SELECT Auszeichnung1_ID, Auszeichnung1_Jahr, ... From ... WHERE ...
ORDER BY Jahr

mir stellt sich nur eine Frage:
Warum hast du deine DB so kompliziert designed?
Mit
Code:
CREATE TABLE Auszeichnungen (CD_ID int, Ausz_ID int, Ausz_JAHR int,...)
hättest du das Problem nicht.
Bei deiner Variante hättest du nicht extra eine neue Tabelle machen müssen. Da hätte es auch gereicht, die 6 Felder an die CD-Tabelle zu hängen. Aber das ist deine Entscheidung.

mfg
 
Ich verstehe das so, dass es eine Auszeichnung auch mehreren CD's-zugeordnet werden kann.

Ich würde lieber doch eine n:m-Beziehung der Tabelle Auszeichnungen zur Tabelle CDs (oder wie auch immer die Tabellen heißen) machen. Auch wenn du maximal nur 3 oder auch nur 2 Auszeichnungen pro CD hast. Dann hast du solche Probleme nicht. Auch an anderen Stellen ist das besser. Wenn du z.B. zählen möchtest, wieviele Auszeichnungen insgesamt in der Tabelle stehen hast du wieder das Problem. Oder wenn du eine neue Auszeichnung zu einer CD zuordnen musst. Außerdem müsstest du bei Abfragen immer
Code:
xyz=Auszeichnung1_ID OR xyz=Auszeichnung2_ID OR xyz=Auszeichnung3_ID
schreiben.
 
Hi!

Erstmal dankeschön für eure ausführlichen Antworten ... Klar mit einer m:n Beziehung wäre es sicher korrekter und problemloser! Unglücklicherweise war ich nicht fähig genug um das zu realisieren. Also bei SQL gabs keine Probleme, aber PHP dazuzuprogrammieren habe ich einfach nicht hinbekommen! Die Bücher die ich habe gehen auf m:n Beziehungen leider auch nur sehr oberflächlich ein (z.B. O´Reilly MySQL Einsatz und Programmierung).

Eure Vorschläge schaffen es ohne Probleme die CDs nach Auszeichnungen zu sortieren. Aber das brauche ich nicht! Ich möchte nach AUSZEICHNUNGSJAHR sortieren! Also z.B. eine Liste aller CDs die einen MTV Award bekommen haben. Ich kann alle CDs mit diesem Award selecten, aber SORTIEREN kann ich dann nicht! Ich könnte nach Erscheinungsjahr der CD sortieren, aber das muss nicht das Auszeichnungsjahr sein! Und nach Auszeichnungsjahr kann ich nicht sortieren, weil ich nicht weiß ober es Ausz.1, 2 oder 3 ist und ich ja nur nach einer Spalte sortieren kann ...

Habt ihr dafür auch eine Idee?

Danke
Arno
 
Ooops, ich korrigier mal meinen Vorschlag, vielleicht siehst du dann, dass es geht ;)

Code:
SELECT Auszeichnung1_ID ID, Auszeichnung1_Jahr Jahr From ... WHERE ...
UNION
SELECT Auszeichnung2_ID, Auszeichnung2_Jahr From ... WHERE ...
UNION
SELECT Auszeichnung3_ID, Auszeichnung3_Jahr From ... WHERE ...
ORDER BY Jahr

mein Fehler, sorry

mfg
 
Hallo!

Leider habe ich nicht mal eine einfache Union Abfrage zusammengebracht ...

z.B.
select * from CD union select * from Auszeichnung
ging nicht ...

Habe mich jetzt entschlossen nochmal eine m:n Beziehung zu probieren und ich habe es schon fast hinbekommen ... Einziges Problem ist folgendes:
Der Benuter füllt das Formular aus und klick auf absenden, dann werden 2 SQL Queries ausgeführt
1.) Query die in CD schreibt, Primary ist dabei das Feld ID mit autoincrement!
2.) Query die in die Tabelle CD_Auszeichnung schreibt.

Das Problem ist dass ich für die 2-te Abfrage ja noch nicht weiß weilche ID die CD mit autoincrement zugewiesen bekommt! Das einzige was mir eingefallen ist, dass ich zwischen 1.) und 2.) nach Titel und Erscheinungsjahr suche (hoffe dass das unique ist) und daraus die ID herauslese! Aber da muss es doch etwas eleganteres geben oder?

Und kennt ihr vielleicht ein Tutorial wo besonders auf m:n eingegangen wird? Mir ist noch nicht ganz klar wie ich das PHP teschnisch am besten realisiere. Ich habe jetzt mal drei Felder gemacht wo man Preise eintragen kann. Schöner wäre aber natürlich dass man einen einträgt und danach ein neues Formular kommt oder? Oder wie macht man sowas im Normalfall?

DANKE für eure Hilfe!

lg
Arno
 
waaaaaaaaaaah (sorry)

nicht select * from cd union select * from ausz.

SONDERN:

Code:
SELECT Auszeichnung1_ID ID, Auszeichnung1_Jahr Jahr From Auszeichnungen WHERE ...
UNION
SELECT Auszeichnung2_ID, Auszeichnung2_Jahr From Auszeichnungen WHERE ...
UNION
SELECT Auszeichnung3_ID, Auszeichnung3_Jahr From Auszeichnungen WHERE ...
ORDER BY Jahr

und wieso m:n

mit einer Tabelle

CDID | AuszID (oder Name) | AuszJahr
---------------------------------------------------------
1 | MTV Music Award | 1998
2 | Echo | 1998
1 | Echo | 2001
...

hättest du das ganz Problem nicht und du könntest ganz einfach nach dem sortieren, was du willst. Warum machst du es dir denn so schwer?
 
Hi!

Ich will ja über die Auszeichnungen mehrere Informationen speicher, Logo, Allg. Infos, usw ... Ebenso über die CDs

Das ist doch eine klassiche m:n Beziehung oder? Ansonsten müsse ich ja in die Tabelle CDs 3-4 Felder reinschreiben die nur die Auszeichnung betrifft (Name, Jahr, Logo, Allg. Infos) und das ganze öfter und das ist redundant. Und wer es eintippt kann sich vertippen, dann steht einmal ECHO, dann Echo oder ECho ...!
 
Hi,

deswegen hatte ich ja auch geschrieben AuszID, Lager die weieren Infos zu den Awards in weitere Tabelle aus. Dann brauchst du nur die ID in deine Auszeichnungstabelle speichern und du hast keine redundanten Daten.
 

Neue Beiträge

Zurück