MySQL Abfrage - Rekursiv&Joins - ihr wissts bestimmt?!

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

  • MySQL Abfrage - Rekursiv&Joins - ihr wissts bestimmt?!

    Hallo Leute!
    Nun, ich habe ein kleines Problem mit einer meiner MySQL abfragen. und
    ich wär echt froh wenn irgend ein profi von euch mir da weiter helfen kann!!

    Grundlegendes zur datenbank:
    ich habe 3 Tabellen mit entsprechenden zeilen (-) wie folgt:
    1. events (beihnaltet eine liste von events)
    - id_events
    - Start
    - Stop
    - Titel
    2. kategorie (beinhaltet verschiedene usergruppen)
    - id_cat
    - subofcat
    - titel
    3. daten (beinhaltet dann schlussendlich alle daten und verlinkt die beiden)
    - ID
    - id_cat
    - id_events

    als beispiel also:
    zeilen in events:
    Code:
    1 - start1 - stop1- faulenzen
    2 - start2 - stop2 - ausflug
    3 - start3 - stop3 - schlafen
    zeilen in kategorie:
    Code:
    1 - NULL - Familienmitglied
    2 - NULL - Besucher
    3 - 1 - Hausmann
    4 - NULL - Irgendwer
    5 - 2 - Freund 
       (heisst so viel wie der Hausmann ist auch ein Familienmitglied, 
       der Freund ist ein Besucher - zeile subofcat sagt welches die
       oberkategorie ist)
    6 - 3 - Markus 
       (Markus ist ein Freund und ein Besucher! - fortgeschritten dann)
    zeilen in data:
    Code:
    1 - 1 - 3 (von start1 bis stop1 gilt faulenzen [1] für den hausmann [3])
    2 - 1 - 4 (von start1 bis stop1 gilt faulenzen [1] für irgendwer [3])
    3 - 3 - 1 (von start3 bis stop3 gilt schlafen [3] für alle familienmitglieder [1]
                   - also ach für den hausmann)
    4 - 2 - 5 (von start2 bis stop2 gilt ausflug [2] für den freund [5]
    soweit so gut

    mit der abfrage:
    PHP-Code:
    SELECT  
      events
    .titel
      
    kategorie.titel AS Wer
      
    events.start
      
    kategorie1.titel AS Hauptkategorie
      
    events.stop 
    FROM 
     events 
     INNER JOIN daten ON 
    (events.id_event=daten.id_event
     
    INNER JOIN kategorie ON (cat.id_cat=daten.id_cat
     
    INNER JOIN kategorie kategorie1 ON (kategorie1.id_cat=kategorie.subofcat
    kriege ich schön alle daten - aber nur für kategorien die eine unterkategorie sind.

    im beispiel würde mir das also folgendes ausgeben:
    Code:
    > hausmann - faulenzen - start1 - stop1
    > freund - ausflug - start2 - stop2
    nicht aber die anderen daten die ja noch vorhanden sind:
    Code:
    > irgendwer - faulenzen - start1 - stop1
    > familienmitglieder - schlafen - start3 - stop3
    soweit mein problem.

    wenn ich mit dem query
    PHP-Code:
    SELECT  
    events
    .titel
    kategorie.titel AS Wer
    events.start
    events.stop 
    FROM 
    events 
    INNER JOIN daten ON 
    (events.id_event=daten.id_event
    INNER JOIN kategorie ON (kategorie.id_cat=daten.id_cat
    alle daten ersuche erhalte ich diese zwar aber ohne die dazugehörigen hauptkategorien (wenn vorhanden)

    im beispiel also:
    Code:
    > hausmann - faulenzen - start1 - stop1
    > freund - ausflug - start2 - stop2
    > irgendwer - faulenzen - start1 - stop1
    > familienmitglieder - schlafen - start3 - stop3
    und nicht wie gewünscht:
    Code:
    > hausmann - familienmitglieder - faulenzen - start1 - stop1
    > freund - besucher - ausflug - start2 - stop2
    > irgendwer - NULL - faulenzen - start1 - stop1
    > familienmitglieder - NULL - schlafen - start3 - stop3
    worum es bei der frage eigentlich geht:
    wenn es mehrere events gibt für familienmitglieder oder freunde
    und ich in einer abfrage alle events für den hausmann suche, dann möchte
    ich auch die events für familienmitglieder gelistet haben...

    kann mir da jemand helfen? mmh (das ganze sollte dann auch noch tiefer
    gehen als nur eine ebene (also auch für einen markus noch funktionieren
    [siehe beispiel oben]) - aber daran wage ich noch gar nicht zu denken )
    oder gibt es eine andere lösung für mein problem? (anderer
    tabellenaufbau usw... ) ich bin dankbar für alle anregungen!

    gruss kendor
    Zuletzt geändert von kendor; 04.09.2007, 18:47.

  • #2
    SELECT ... FROM kategorie LEFT JOIN events ON ...

    Kommentar


    • #3
      Original geschrieben von onemorenerd
      SELECT ... FROM kategorie LEFT JOIN events ON ...
      wie soll ich das verstehen...

      was ich weiter versucht habe ist folgendes:
      Code:
      SELECT 
       daten.id_event,
       daten.id_cat,
       events.titel AS WAS,
       cat.titel AS WER
      FROM
       daten
       LEFT JOIN events ON (daten.id_event=events.id_event)
       LEFT JOIN cat ON (daten.id_cat IN (
           SELECT t1.id_cat AS lev1, t2.id_cat AS lev2, t3.id_cat as lev3
              from sch_cat as t1
              left join sch_cat as t2 on t2.`subofcat` = t1.`id_cat`
              left join sch_cat as t3 on t3.`subofcat` = t2.`id_cat`
              where t3.titel='Hausmann'
           )
       )
      das subquery
      Code:
      (
           SELECT t1.id_cat AS lev1, t2.id_cat AS lev2, t3.id_cat as lev3
              from sch_cat as t1
              left join sch_cat as t2 on t2.`subofcat` = t1.`id_cat`
              left join sch_cat as t3 on t3.`subofcat` = t2.`id_cat`
              where t3.titel='Hausmann'
           )
      gibt mir die parent ids des hausmanns an und für all die brauch ich ja auch die events.
      aber ich krieg den fehler
      Code:
      SQL Error: Operand should contain 1 column(s)
      was ja auch verständlich ist (das subquery gibt mehr als einen wert zurück)

      hilfe! danke.... :S

      Kommentar


      • #4
        Bau es langsam auf, einen JOIN nach dem anderen. Wenn es irgendwann gar nicht mehr geht, solltest du dein Schema überdenken. Ich glaube beispielsweise Individuen (Hausmann) und Gruppen (Familienmitglieder) zu erkennen, alle in einer Relation ... nicht fertig normalisiert!

        Kommentar


        • #5
          also - ich hab so viel zeit damit verbracht ein anständiges query zu finden wo man das direkt machen kann und es nicht geschafft, jetzt hab ich das ganze halt mit php gemacht:
          PHP-Code:
              function list_category_events($id){
                if(
          $id>0$more="WHERE sch_cat.id_cat=".$id;
                  
          $sql="SELECT 
                        sch_daten.id_event,
                        sch_daten.id_cat,
                          sch_daten.ID,
                          sch_cat.titel AS Wer,
                          sch_events.titel AS Was
                      FROM sch_events
                       INNER JOIN sch_daten ON (sch_events.id_event=sch_daten.id_event)
                       INNER JOIN sch_cat ON (sch_cat.id_cat=sch_daten.id_cat)"
          .$more;
                
          $result=query_database($sql);
                return 
          $result;
              }
              
              function 
          get_parent_of_id($id){
                  
          $result=query_database("SELECT subofcat AS parent FROM sch_cat WHERE id_cat=".$id." LIMIT 1");
                  
          $row=mysql_fetch_assoc($result);
                  return 
          $row['parent'];
              }
              
              function 
          table_of_all_events_for_id($id=0){
                  
          $actual_id=$id;
                  echo 
          '<table width="98%">';
                  echo  
          '<tr>';
                  echo    
          '<td>ID</td>';
                  echo    
          '<td><strong>WER</strong> (ID)</td>';
                  echo    
          '<td><strong>WAS</strong> (ID)</td>';
                  echo  
          '</tr>';     
                  
          $num_results=0;
                  while(
          $actual_id!=NULL){
                     
          $result=list_category_events($actual_id);
                     
          $num_results+=mysql_num_rows($result);
                     while(
          $row=mysql_fetch_assoc($result)){
                          echo  
          '<tr>';
                          echo    
          '<td>'.$row['ID'].'</td>';
                          echo    
          '<td>'.$row['Wer'].' Parent:'.get_parent_of_id($row['id_cat']).'& ID'.$row['id_cat'].'</td>';
                          echo    
          '<td>'.$row['Was'].' ('.$row['id_event'].')</td>';
                          echo  
          '</tr>';                                  
                      }
                      echo 
          "<tr><th colspan=\"3\"><hr></th></tr>";
                      
          $actual_id=get_parent_of_id($actual_id);
                  }
                  echo 
          "</table>"
                  echo 
          '<p>Anzahl Events: '.$num_results.'</p>';
              } 

          Kommentar


          • #6
            ähm... einfach ein

            PHP-Code:
            SELECT  
              events
            .titel
              
            kategorie.titel AS Wer
              
            events.start
              
            kategorie1.titel AS Hauptkategorie
              
            events.stop 
            FROM 
             events 
             INNER JOIN daten ON 
            (events.id_event=daten.id_event
             
            INNER JOIN kategorie ON (cat.id_cat=daten.id_cat
             
            LEFT JOIN kategorie kategorie1 ON (kategorie1.id_cat=kategorie.subofcat

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              ähm nein - denn so kriege ich ja einfach nur die events / daten für alle resp. für eine bestimmte gruppe.

              ich will ja aber auch die events der parents einer gruppe und die deren parents....

              Haupgruppe1
              -- Gruppe1.1
              ---- Untergruppe 1.1.1
              -- Gruppe1.2
              ---- Untergruppe 1.2.2
              ---- Untergruppe 1.2.3
              ------ Unteruntergruppe 1.2.3.1
              ------ Unteruntergruppe 1.2.3.2
              -- Gruppe1.3
              Haupgruppe2
              -- Gruppe2.1
              ---- Untergruppe 2.1.1
              -- Gruppe2.2
              ---- Untergruppe 2.1.1
              ------ Unteruntergruppe 2.1.1.1


              sagen wir ich will alle events die die mitglieder der hauptgruppe1 haben. dann kriege ich die einträge mit zugehörgkeit hauptgruppe1
              oder die der untergruppe1.2.3 dann kriege ich die (mit deimem query)

              für meine anwendung will ich aber jetzt die einträge der hruppe und deren parents...
              also sage ich beispielsweise die events für unteruntergruppe 1.2.3.2. dann will ich alle einträge der:
              - unteruntergruppe 1.2.3.2
              - untergruppe 1.2.3
              - gruppe 1.2
              - hauptgruppe 1

              alle events der hauptgruppe1 gelten auch für ihre childs. alle der gruppe2.2 auch für ihre childs usw...

              und ich hab nicht rausgefunden wie man das mit sql direkt machen kann (da man ja die tiefe der struktur nicht kennt...? man müsste also immer alle daten der parentgruppe auslesen können bis der parent keinen parent mehr hat)

              vielleicht hab ich mich in meinem ersten post schlecht ausgedrückt. danke für die hilfe.

              Kommentar


              • #8
                Was du demnach suchst ist wohl "nested set"~

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar

                Lädt...
                X