Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabellen verknüpfen

Einklappen

Neue Werbung 2019

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

  • Tabellen verknüpfen

    Hallo,
    ich habe 2 Tabellen. Diese heißen "location" und "art". Eine Location ist zum Beispiel ein Restaurant oder eine Disco. Als Art bezeichne ich die Sorte einer Location, also z.B. Disco, Restaurant, Cafe, Kneipe usw.

    Eine Location kann mehrere Arten besitzen, z.B. kann ein Cafe auch ein Restaurant sein. Eine Art kann von mehreren Locations benutzt werden. Somit haben wir eine m:n-Beziehung. Richtig?

    Wie muss ich das ganze jetzt in MySQL realisieren? Hab das inzwischen soweit hingekriegt, dass ich eine 1:n-Beziehung darstellen kann. Die Abfrage sieht so aus:

    PHP-Code:
    <?php
    $sql
    =mysql_query("SELECT location.locationid, location.name, art.sorte, location.adresse_ort, location.artid, art.artid FROM location JOIN art ON (location.artid=art.artid) ORDER BY location.locationid ASC")
    ?>
    Es klappt alles. Es wird mir die Location mit der dazugehörigen Art angezeigt. Nur ist das Problem, dass nicht mehr als eine Art angezeigt werden kann. Dies sollte aber möglich sein.

    Muss ich die Tabellen umformen? Oder was muss ich anderes machen?

    Tabelle 1 "location" sieht in etwa so aus:
    locationid | name | adresse_ort | artid

    Tabelle 2 "art" sieht so aus:
    artid | sorte

    Vielen Dank für jede Hilfe,
    Gruss!

  • #2
    Geht es um eine sql oder um eine php Frage?
    Bitte das sql Statement formatiert angeben: Ist sonst genauso schlecht oder noch schlechter zu lesen wie unformatierter php code.
    Code:
    SELECT
    	location.locationid, location.name, art.sorte, location.adresse_ort, location.artid, art.artid
    FROM
    	location
    LEFT JOIN
    	art ON location.artid=art.artid
    ORDER BY
    	location.locationid ASC
    LEFT JOIN verbindet jeden einzelnen Datensatz der linken(ersten) Tabelle mit allen jeweils passenden Datensätzen der rechten(zweiten) Tabelle. Gibt es keinen passenden rechten Datensatz, wird der linke einmal angegeben. Die Felder des rechten Datensatzen sind dann NULL.

    Wie man eine Anfrage an den sql Server schickt wissen wir Ist also für sich allein überflüssig hier.
    Es kann natürlich sein, dass Du die Datensätze hinterher falsch abholst. Aber das können wir aus dem Codestückchen nicht sehen.

    Kommentar


    • #3
      Hallo und Danke für die schnelle Antwort.

      Habe leider den Unterschied von LEFT JOIN und dem einfachen JOIN nicht verstanden. Sollte ich mein JOIN in LEFT JOIN ändern?

      Ok, hier etwas mehr zum Problem:

      Auf der eintragen1.php suche ich auf einer Auswahlliste die Art der location aus.

      PHP-Code:
       <td width="200" class="text11"><div align="left"> 
                      <select name="lokalitaetart[]" size="3" multiple style="width:150px; height:60px;">
      <?php 
      $result
      mysql_query("SELECT artid, sorte FROM art order by artid ASC");
      while (
      $row mysql_fetch_object($result)) 
      {
      print 
      "<option value=".$row->artid.">".$row->sorte."</option>";
      }
      ?>
      </select>
      <?php 
      if($_POST != NULL){ 
      $x=1
      foreach(
      $lokalitaetart as $auswahl) { 
      $name_var="lok_art".$x
      session_register($name_var); 
      $
      $name_var=$auswahl;


      ?> 
                    </div></td>
      Wähle ich "Disco" aus wird die dazugehörige artid in die Variable und später in der DB gespeichert. Die Zeile in der location-Tabelle siht dann so aus:
      locationid | name | adresse_ort | artid
      45 | Groovy Star | Berlin | 4

      In der art-Tabelle steht:
      artid | sorte
      2 | Cafe
      3 | Kneipe
      4 | Disco

      Beim Anzeigen der Ergebnisse mit dem SELECT-Befehl (s.o.) erscheint dann: 45 | Groovy Star | Berlin | Disco

      Wie mache ich es jetzt am geschicktesten dass ich mehrere Werte von der Auswahlliste auswählen kann, diese gespeichert werden und beim Anzeigen der Location auch mehrere Arten erscheinen können, z.B. so:
      45 | Groovy Star | Berlin | Disco, Kneipe, Bar

      Noch mal Danke!

      Kommentar


      • #4
        übrigens:

        if($_POST != NULL){

        trifft nie zu.
        POST ist nie NULL, wenn überhaupt, ist das POST-array leer.

        grüße
        axo

        Kommentar


        • #5
          Der Code zum Eintragen ist sicherlich sehr interessant, aber an dieser Stelle irrelevant. Ob etwas und wie etwas eingetragen wird, kannst Du mit anderen Programmen, zB phpmyadmin, nachprüfen.

          Beim Anzeigen der Ergebnisse mit dem SELECT-Befehl (s.o.) erscheint dann: 45 | Groovy Star | Berlin | Disco
          Der Code ist relevant. Warum schreibst Du genau den nicht hier rein?

          Kommentar


          • #6
            Hallo,
            welchen genauen Code meinst Du denn?

            Hier der komplette Code zum Anzeigen der Location-Inhalten in Form einer Tabelle:
            PHP-Code:
              <table>
                <tr> 
                  <td>Nr.</td>
                  <td>Name</td>
                  <td>Art</td>
                  <td>Ort</td>
                </tr>
                <tr> 
              <?php
                $sql
            =mysql_query("SELECT location.locationid, location.name, art.sorte, location.adresse_ort, location.artid, art.artid FROM location JOIN art ON (location.artid=art.artid) ORDER BY location.locationid ASC")
                or die (
            "[B]Fehler beim Datenbankzugriff</body></html>");
                
            $i 0;
                while(
            $result=mysql_fetch_array($sql)) 
                {
            ?>
                  <td>
                  <?php
                    
            echo $result[locationid];
                    
            ?>
             </td>
                  <td>
                  <?php
                    
            echo $result[name];
                    
            ?>
            </td>
                  <td>
                      <?php
                    
            echo $result[sorte];
                    
            ?>
            </td>
                  <td>
                  <?php
                    
            echo $result[adresse_ort];
                    
            ?>
            </td>
                </tr>
                   <?php
                $i
            ++;
                }
            ?>
              </table>
            Meinst Du etwa den? Den Eintragen-Code (siehe letztes Posting) habe ich eingefügt, weil ich denke dass das Problem da schon anfängt. Vielleicht muss man da schon etwas ändern.

            Danke für jede Hilfe

            Kommentar


            • #7
              Hallo,
              kann mir keiner helfen oder wurde ich nicht verstanden?

              Danke noch mal

              Kommentar


              • #8
                Hast Du Dir den Inhalt der Datenbank mittlerweile per phpmyadmin o.ä. schon angesehen?
                Funktioniert das Eintragen?

                Im Zweifelsfall sämtliche sql Statements ausgeben alssen, bevor sie ausgeführt werden.
                also zB statt
                $result= mysql_query("SELECT artid, sorte FROM art order by artid ASC");
                PHP-Code:
                <?php
                ...

                $sql "SELECT artid, sorte FROM art order by artid ASC";
                /* Debug */ echo '

                Debug: '
                htmlentities($sql), "</p>\n";
                $resultmysql_query($sql);
                Fehlerbehandlung einbauen. Simple Methode
                statt
                $result= mysql_query($sql);
                PHP-Code:
                <?php
                ...
                $resultmysql_query($sql) or die(mysql_error());
                ...
                ?>

                Kommentar


                • #9
                  Hallo,
                  das Eintragen mit dem Code oben funktioniert. Genauso wie das Anzeigen der Einträge.

                  Ich glaube aber, dass ich nicht verstanden wurde, was ich denn will. Deswegen versuche ich es noch Mal. Wie im ersten Posting beschrieben handelt es sich bei den Tabellen "location" und "art" um eine n:m-Beziehung. Wie kann ich diese realisieren? Da ich noch nicht so fortgeschritten bin in PHP und MySQL habe ich bis jetzt nur eine 1:n-Beziehung realisiert, die problemlos funktioniert. Die einzige Sache ist, dass nicht mehr als eine Art bei einer Lokalität eingetragen werden kann. Dies sollte aber möglich sein.

                  Wie kann ich also die m:n-Beziehung realisieren? Spalten einfügen? Code ändern????

                  Danke!

                  Kommentar


                  • #10
                    Zitat von corona
                    Die einzige Sache ist, dass nicht mehr als eine Art bei einer Lokalität eingetragen werden kann. Dies sollte aber möglich sein.

                    Wie kann ich also die m:n-Beziehung realisieren? Spalten einfügen? Code ändern????
                    Nicht Spalten einfügen, sondern eine neue Tabelle.
                    Dies könnte hilfreich sein:
                    http://de.wikipedia.org/wiki/Normali...28Datenbank%29

                    "Location"-Tabelle:
                    id,name
                    1,A5-Discopark
                    2,Caramboulage

                    "Art"-Tabelle:
                    id,bezeichnung
                    1,disco
                    2,restaurant
                    3,kneipe

                    "LocationArt"-Tabelle
                    locationId,artId
                    1,1 // Jetzt ist A5-Discopark als Disco markiert
                    2,2 // Das Caramboulage als Restaurant
                    2,3 // und als Kneipe

                    Kommentar


                    • #11
                      Drei Tabellen verwenden.
                      art:
                      1, Cafe
                      2, Disco
                      3, Restaurant
                      4, Theater
                      5, Hotel

                      location:
                      1, Ritz
                      2, Colosseum

                      irgendwas:
                      1,1
                      1,3
                      1,5
                      2,4

                      Das Ritz(1) ist/hat ein Cafe(1) -> 1,1
                      Das Ritz(1) ist/hat ein Restaurant(3) -> 1,3
                      Das Ritz(1) ist/hat ein Hotel(5) -> 1,5
                      usw usw

                      Kommentar


                      • #12
                        Hallo,
                        eine neue Tabelle "loc_art" zu verwenden ist meiner Meinung nach auch der richrtige Ansatz. Kriege ich das als Anfänger auch hin?

                        Ist es danach möglich einer Lokalität mehrere Arten zuzuweisen? Also z.B.:
                        1,15 : Das Ritz (1) ist/hat ein Cafe(1) und ein Hotel(5)

                        Wenn ja, wie muss ich dabei vorgehen? Brauche ich den Fremdschlüssel "artid" nicht mehr in der Tabelle "location"? Falls nein, wie schafe ich dann den Zusammenhang zwischen den Tabellen her?

                        Vielen Dank!

                        Kommentar


                        • #13
                          Zitat von corona
                          Ist es danach möglich einer Lokalität mehrere Arten zuzuweisen? Also z.B.:
                          1,15 : Das Ritz (1) ist/hat ein Cafe(1) und ein Hotel(5)
                          Diese Frage ist ja oben beantwortet (sogar mit Text und nichtmal mit Code). Verknüpfen tust du beide über die ID.

                          Kommentar


                          • #14
                            1,15 : Das Ritz (1) ist/hat ein Cafe(1) und ein Hotel(5)
                            Nicht so, sondern zwei Datensätze in der Tabelle irgendwas/loc_art oder auch drei oder zehn oder soviel Du haben willst.

                            irgendwas:
                            1,1
                            1,3
                            1,5
                            2,4

                            Das Ritz(1) ist/hat ein Cafe(1) -> 1,1
                            Das Ritz(1) ist/hat ein Restaurant(3) -> 1,3
                            Das Ritz(1) ist/hat ein Hotel(5) -> 1,5

                            Kommentar


                            • #15
                              Danke für die Antworten.

                              Zumindest habe ich das jetzt vom Prinzip her verstanden. Jetzt muss ich nur noch verstehen wie ich das am besten umsetze :wink:

                              Ich trage ja mit Hilfe eines Auswahlmenues die Art in die DB bzw. Session ein. Siehe dazu Code oben. Den Code muss ich jetzt wahrscheinlich um ändern. In welcher Tabelle speichere ich dann die Art? In die loc_art? Und wie kann ich einen Insert-Befehl machen, damit mehrere Zeilen in die DB gespeichert werden, wenn mehrere Arten ausgewählt sind?

                              Muss ich beim Anzeigen der Inhalte auch was ändern?

                              In der Tabelle "art" kann ich die Spalte mit dem Frendschlüssel "artid" löschen, richtig? Die Tabelle "art" lasse ich so wie sie ist. Ich erstelle eine neue Tabelle "loc_art" mit den Spalten: loc_artid, locationid, artid.

                              Alles richtig verstanden?

                              Danke für weitere Hilfe!
                              Gruss!

                              Kommentar

                              Lädt...
                              X