Fehler im ER-Model oder Problem beim JOIN?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fehler im ER-Model oder Problem beim JOIN?

    hallo.


    ich sitze seit 2 tagen an einer aufgabe, die mir so einfach und so simpel erschien... aber nichts will hin hauen!
    ich bin schon am überlegen ob meine komplette normalisierung vielleicht falsch ist und damit die schon mühsam angelegte datenbank...

    folgendes:
    in einer datenbank sollen audio-CD´s mit track-namen gespeichert werden. soweit nichts besonderes.
    ferner sollen über eine tabelle "bilder/grafiken" den einzelnen track zugeordnet werden (eigentlich auch nichts besonderes).

    beispiel:
    - dem song "Baha Man - Who Let The Dogs Out" werden bilder von hunden zugeordnet (assoziations mäßig)
    - dem song "Herbert Grönemeyer - Zum Meer" werden schöne meer-fotos zugeordnet
    - usw usw usw.

    mein bisheriges datenbank-model

    [FONT=courier] tabelle: pics
     ------------------------------------------
     | pic_id | bildurl | trk_id | uploaddate |
     |--------|---------|--------|------------|
     |      1 | u/5.jpg |      2 | 2004-05-12 |
     |      2 | d/1.jpg |      4 | 2004-05-10 |
     |      3 | u/6.jpg |      2 | 2004-01-22 |
     |      5 | e/8.jpg |      2 | 2004-01-15 |
     |      6 | e/9.jpg |      4 | 2003-12-04 |
     ------------------------------------------

     tabelle: track
     -----------------------------------------
     | trk_id | cd_id | name       &nbs p;         |
     |--------|-------|----------------------|
     |      1 |     3 | Zum&n bsp;Meer             |
     |      2 |     2 | Who&n bsp;Let The Dogs Out |
     |      3 |     3 | Mensc h               |
     |      4 |     3 | Der&n bsp;Weg              |
     -----------------------------------------

     tabelle: cd
     ------------------------------
     | cd_id | tite          &nbsp ;    |
     |-------|--------------------|
     |     2 | Baha Man            |
     |     3 | Herbert Grönemeyer |
     ------------------------------


     beziehungen:

     ########   N / \ 1   #########   1 / \ 1   ######
     # pics #-----   -----# track #-----   -----# cd #
     ########     \ /     #########     \ /     ######
    [/FONT]

    nun möchte ich in einer liste möglichst OHNE / bzw mit möglichst WENIG ineinaner verschachtelten schleifen eine liste aller cds mit allen tracks und der jeweils zugeordneten anzahl bilder ausgeben! (das es funktioniert mit ineinander verschachtelten schleifen und vielen dantenbank abfragen hintereinander das weiß ich )

    also:
    [font=courier]CD - Hernert Grönemeyer
    - Zum Meer (0)
    - Mensch (0)
    - Der Weg (2)

    CD - Baha Man
    - Who Let The Dogs Out (3)[/font]

    (info: in den klammern steht jeweils die anzahl der bilder, die dem song zugeordnet sind)


    problem:
    ...tja, wenn ich das wüsste! also ich habs schon mit sämtlichen LEFT, RIGHT und INNER JOINS probiert, leider ohne erfolg
    inzwischen bin ich bei 2 in einander verschachtelten schleifen angelangt, aber selbst da funktioniert es nicht.


    PHP-Code:
    $commands="SELECT * FROM cd";
    $result_cd db_execute($commands);

    while(
    $row_cd=mysql_fetch_object($result_cd)) {
      echo 
    'CD - '.$row_cd->titel.'<br>';

      
    //$commands="SELECT count(pics.trk_id) summe
      
    FROM picstrack
      WHERE pics
    .trk_id track.trk_id";

      //
    $commands="SELECT *, count(pics.trk_idsumme
      FROM track
    pics
      WHERE track
    .cd_id $row_cd->cd_id
      
    AND pics.cd_id $row_cd->cd_id
      GROUP BY pics
    .trk_id";

      // info: beide SELECT anweisungen funktionieren nicht!

      
    $result = db_execute($commands);

        while(
    $row=mysql_fetch_object($result)) {
          echo 'track name = '.
    $row->name.' - ('.$row->summe.')<br>';
        }


    es treten immer die selben probleme auf, egal was für JOINS ich nehem oder wie ich es verschachtel:
    - es werden NUR die tracks ausgegeben, die bilder enthalten! (also wenn einem track keine bilder zugeordnet sind, wird dieser bei der CD nicht mit ausgegeben!
    - es werden ALLE in der tabelle "track" enthaltenen lieder zu EINEM album ausgegeben!
    - es werden alle tracks zu der entsprechenden CD ausgegeben (wie ich es auch eigentlich will) allerdings sind die klammern () leer, also fragt er die "pic" tabelle nicht mit ab und zählt die bilder!
    - ...


    *verzweifel*


    inzwischen mach ich mir halt gedanken, ob mein ER-Model vielleicht einen fehler enthält? KANN es so gar nicht funktionieren?????

    JEDES bild ist ja genau EINEM track zugeordnet.
    und JEDER track ist genau EINER cd zugeordnet.
    also ist doch auch JEDES bild über die verknüpfung EINER cd zugewiesen, oder?


    wäre wirklich nett wenn mir hier jemand helfen könnte!

    vielen dank soweit
    GLORIA PERPETUA

  • #2
    ohne jetzt wirklich fertig gelesen zu haben:

    dein ER-Modell besagt:

    ein pic ist genau einem titel zugeordnet aber ein titel kann viele pics haben.

    sowie

    eine cd hat genau einen track und ein track ist nur auf einer cd.

    sorry aber dein er modell ist etwas daneben geraten

    wenn ich mir eine cd sammlung anschaue und du wirklich die absolute normalform haben willst (allso jeden titel nur einmal in der sammlung, egal ob jetzt original, best of oder sampler album) da sollte dein er modell folgendermassen aussehen:

    titel n:m cd

    wir gehen jedoch davon aus das jede cd nur lider enthält die auf ihr einzigartig sind:

    titel n:1 cd

    und sofern kein bild für mehr als einen title verwendet wird erhalten wir

    bilder n:1 track n:1 cd.

    da du aber sagst, das jedes bild nur eine track hat -> was die sache vereinfachn würde:

    hätten wir

    track n:1 cd

    da wir das bild ja ohne weiteres in die track-tabelle mit eingeben können. es mach nur in den seltesten fällen sinn, eine 1:1 verbindung zu erzeugen / verwenden.

    hoffe konnte dir etwas helfen

    Kommentar


    • #3
      Re: Fehler im ER-Model oder Problem beim JOIN?

      hm, stimmt. das heißt, so müsste es richtig sein?

      [FONT=courier]&nbsp;########&nbsp;&nbsp;&nbsp;N&nbsp;/&nbsp;\&nbsp;1&nbsp;&nbsp;&nbsp;#########&nbsp;&nbsp;&nbsp;N&nbsp;/&nbsp;\&nbsp;1&nbsp;&nbsp;&nbsp;######
      &nbsp;#&nbsp;pics&nbsp;#-----&nbsp;&nbsp;&nbsp;-----#&nbsp;track&nbsp;#-----&nbsp;&nbsp;&nbsp;-----#&nbsp;cd&nbsp;#
      &nbsp;########&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#########&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;######
      [/FONT]



      ok, soweit stimmt es dann. das ändert doch aber noch nichts an der abfrage?!
      weil 1 bild ist ja immer noch nur 1 track zugeordnet, und über diese verbindung wird auch "indirekt" einer cd... hm.

      danke soweit, allerdings ändert sich da nichts in meiner datenbank, sondern nur auf meinem papier (wo jetzt steht: track n:1 cd)^^


      edit:

      Original geschrieben von jochenj
      da wir das bild ja ohne weiteres in die track-tabelle mit eingeben können.

      achso, du meinst das so, das die "track" tabelle zusätzlich alle attribute der "pics" tabelle enthalten soll?
      das geht ja leider nicht, da zu einem track ja mehrere bilder gehören sollen. (oder hab ich das falsch verstanden?)
      Zuletzt geändert von deklarmart; 30.05.2004, 22:10.
      GLORIA PERPETUA

      Kommentar


      • #4
        sorry, ich war zu faul das mit mysql zu machen und habe das flott mal unter access getestet.

        tabelle

        cd:
        id-cd (autowert / primär)
        cdname (text)

        titel:
        id-titel (autowert / primär)
        titel (text)
        cd (fremdschlüssel der tabelle cd)

        bilder:
        id-bilder (autowert / primär)
        bilder (text)
        id-titel (fremdschlüssel der tabelle tittel)

        die abfrage

        Code:
        SELECT 
          cd.cdname, cd.[id-cd], titel.titel, titel.[id-titel], bilder.[id-titel], bilder.bilder
        FROM 
          cd 
        INNER JOIN 
          (titel INNER JOIN bilder ON titel.[id-titel] = bilder.[id-titel]) ON cd.[id-cd] = titel.[id-cd];
        ich weis einige werden mich verfluchen, das ich es mit ms access gemacht habe, aber ist ja auch schon spät und es funktioniert. sollte auch auf mysql übertragbar sein.

        Kommentar


        • #5
          jau, danke. ich wers jetzt gleich testen (jedenfalls es probieren) wenn die 2 gläser matini meine konzentration nichtso doll stören


          ich hätte es natürlich auch in access gemacht, keine frage! (eigentlich lege ich zuerst JEDE sql datenbank die ich plane in access um, alleine wegen der guten beziehungsübersicht zum ausdrucken)^^

          allerdings ist mein acces seit monaten im arsch (kommen ständig speicher verletzungen -,-) und die office cd ist weg.

          nunja, vielen vielen dank soweit. evt meld ich mich nochmal^^ n8
          GLORIA PERPETUA

          Kommentar

          Lädt...
          X