tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
724
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    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? :o)

    Danke
    Arno
     

  2. #2
    Registriert seit
    Jul 2002
    Ort
    Frankfurt (Hessen)
    Beiträge
    2.135
    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
     

  3. #3
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi, probier doch mal die Abfrage der 3 Auszeichnungen per UNION zu verknüpfen, also

    Code :
    1
    2
    3
    4
    5
    6
    
    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 :
    1
    
    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
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  4. #4
    Frankdfe Frankdfe ist offline Mitglied Gold
    Registriert seit
    Apr 2003
    Beiträge
    151
    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 :
    1
    
    xyz=Auszeichnung1_ID OR xyz=Auszeichnung2_ID OR xyz=Auszeichnung3_ID
    schreiben.
     
    Der Glückliche phantasiert nie. (Sigmund Freud)
    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)
    Daraus folgt: Die Genie's sind nicht glücklich.

  5. #5
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    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
     

  6. #6
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Ooops, ich korrigier mal meinen Vorschlag, vielleicht siehst du dann, dass es geht

    Code :
    1
    2
    3
    4
    5
    6
    
    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
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  7. #7
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    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
     

  8. #8
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    waaaaaaaaaaah (sorry)

    nicht select * from cd union select * from ausz.

    SONDERN:

    Code :
    1
    2
    3
    4
    5
    6
    
    SELECT Auszeichnung1_ID ID, Auszeichnung1_Jahr Jahr From [COLOR=Red]Auszeichnungen[/COLOR] WHERE ...
    UNION
    SELECT Auszeichnung2_ID, Auszeichnung2_Jahr From [COLOR=Red]Auszeichnungen[/COLOR] WHERE ...
    UNION
    SELECT Auszeichnung3_ID, Auszeichnung3_Jahr From [COLOR=Red]Auszeichnungen[/COLOR] 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?
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  9. #9
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    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 ...!
     

  10. #10
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  11. #11
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    Aber jeder Award kann nur einmal vergeben werden! Also wenn der MTV Award an 2 CDs geht muss ich alle Informationen zu dem Award nocheinmal eingeben ...?
     

  12. #12
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Wieso kann jeder Award nur einmal vergeben werden?
    Soweit mir bekannt, werden die meisten jährlich verliehen. Wieso willst du also für jede Verleihung alles aufschreiben.
    Deshalb habe ich ja den Vorschlag gemacht, alle möglichen Awards in einer Tabelle auflisten und dann kannst du in einer Zuordnungstabelle jeden Award beliebig oft verleihen. Und dadurch dass du ja die Jahreszahl in der Zuordnungstabelle speicherst, kannst sogar sicherstellen, dass ein Award nicht zweimal verliehen in einem Jahr wird.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  13. #13
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    Sorry, ich verstehs einfach nicht ...

    Ich sehe das so ...

    MÖGLICHKEIT 1:
    1.) CD
    CD_ID | Titel | Interpret | Preis | usw.
    1 | Leben des Brian | Monty Pythons | 15 | ...
    2 | Best Of 1 | Queen | 13 | ...
    3 | Columbia Years | Frank Sinatra | 10 | ...

    2.) Auszeichnungen
    Ausz_ID | Name | Logo | Land | usw.
    1 | MTV Musik Award | mtv.jpg | UK | ...
    2 | Echo | echo.jpg | Deutschland | ...
    3 | Kalr Moik´s Best | moik.jgg | Österreich | ...

    3.) CD_Auszeichnung
    CD_ID | Ausz_ID | Jahr
    1 | 3 | 2001
    1 | 1 | 2001
    2 | 2 | 2004
    usw.

    Das ist dann ja eine m:n Beziehung ...

    Wenn ich es so machen würde wie du vorschlägst (wenn ich das richtig verstehe) ...

    MÖGLICHKEIT 2:
    1.) CD
    CD_ID | Titel | Interpret | Preis | usw.
    1 | Leben des Brian | Monty Pythons | 15 | ...
    2 | Best Of 1 | Queen | 13 | ...
    3 | Columbia Years | Frank Sinatra | 10 | ...

    So und was ist, wenn jetzt Monty Pythons und Frank Sinatra einen MTV Award bekommen? Dann sieht das so aus:
    2.) Auszeichnungen
    Ausz_ID | CD_ID | Name | Logo | Land | usw.
    1 | 1 | MTV Musik Award | mtv.jpg | UK | ...
    4 | 3 | MTV Musik Award | mtv.jpg | UK | ...
    2 | 1 | Echo | echo.jpg | Deutschland | ...
    3 | 2 | Kalr Moik´s Best | moik.jgg | Österreich | ...

    Die erste und die zweite Zeile sind dabei fast ident (viel Redundanz) ...

    Daher ist die erste Möglichkeit doch die bessere oder? Und das ist auch okay ... Das einzige Problem das ich dabei noch habe ist, dass ich eben die IDs mit autoincrement vergebe.

    Ich schreibe also die Formulardaten in CD und dann in CD_Auszeichnung! Für das schreiben in CD_Auszeichnung brauche ich aber die ID der CD (die gerade erst generiert wurde) und ich weoß nicht wie ich die bekomme!

    Danke
    lg
    Arno
     

  14. #14
    gerthsen gerthsen ist offline Rookie
    Registriert seit
    Jun 2005
    Beiträge
    7
    Habs schon ...

    Das was ich suchte wird von der MySql Funktion select last_insert_id() bewerkstelligt!
     

Ähnliche Themen

  1. Arraylist nach mehren Spalten sortieren
    Von schuetzejanett im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 2
    Letzter Beitrag: 06.06.07, 12:18
  2. [MySQL] Soriterung nach mehreren Spalten
    Von ronaldo84 im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 18.04.07, 16:45
  3. Nach 2 Spalten sortieren
    Von dwex im Forum Relationale Datenbanksysteme
    Antworten: 7
    Letzter Beitrag: 28.04.06, 14:28
  4. Abfrage nach 2 spalten sortieren
    Von matthoz im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 08.01.06, 11:49
  5. [MySQL] Sortieren nach 2 Spalten?
    Von Suchfunktion im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 05.07.05, 13:59