Join über 3 Tabellen



  • Ich habe folgende Tabellenstruktur:

    Tabelle: benutzer

    benutzer_id ...,
    benutzername CHAR(40) UNIQUE NOT NULL,
    ...
    

    Tabelle: artikel

    ueberschrift ...,
    erstellt ...,
    freigabe ...,
    bearbeitet ..,
    autor TINYINT NOT NULL UNSIGNED, #Fremdschlüssel benutzer.benutzer_id,
    artikel_id INT NOT NULL AUTO_INCREMENT PRIMARY_KEY
    ...
    

    Tabelle: menu

    linkname CHAR(60) NOT NULL,
    linkziel INT NOT NULL DEFAULT '#' # Wenn linkziel auf einen Artikel linkt, dann hat es als Wert die artikel_id
    ...
    

    Jetzt möchte ich einige Daten in einer HTML-Tabelle ausgeben.

    artikel.ueberschrift | menu.linkname | benutzer.benutzername | artikel.erstellt | artikel. bearbeitet | artikel.freigabe

    Meine SQL Abfrage sieht bisher in etwa so aus:

    SELECT
      art.ueberschrift,
      art.erstellt,
      art.bearbeitet,
      art.freigabe
      art.autor
      men.linkname,
      ben.benutzername
    FROM
      artikel art,
      menu men,
      benutzer ben
    WHERE
      art.artikel_id = men.linkziel
    ORDER BY
      ueberschrift DESC
    

    Ich weiß jetzt nicht wie ich den Autor (mit namen) auch abfragen kann. Das andere funktioniert alles.

    MfG CSS



  • Kann mir den keiner helfen?



  • Meinst du sowas hier?

    SELECT 
      art.ueberschrift, 
      art.erstellt, 
      art.bearbeitet, 
      art.freigabe 
      art.autor 
      men.linkname, 
      ben.benutzername 
    FROM 
      artikel art, 
      menu men, 
      benutzer ben 
    WHERE 
      art.artikel_id = men.linkziel
    #Autor festlegen
      AND
      ben.benutzername = 'CSS'
    
    ORDER BY 
      ueberschrift DESC
    

    Übrigens: deine Frage wäre im Datenbankforum besser aufgehoben gewesen, ist jetzt aber egal...



  • Okay, gehört wirklich ins Datenbankforum.
    Nein ich meine sowas hier: z.B.
    Es gibt 3 benutzer:
    Max Mustermann => hat 3 Artikel verfasst (Artikel1, Artikel2, Artikel3),
    Georg Geldsack => hat 1 Artikel verfasst (Artikel4),
    Otto Normalverdiener => hat 2 Artikel verfasst(Artikel5, Artikel6)

    Die Ausgabe soll jetzt so aussehen:
    Überschrift zu Artikel1 | Link zu Artikel1 | Max Mustermann | erstellt | bearbeitet | freigegeben
    Überschrift zu Artikel2 | Link zu Artikel2 | Max Mustermann | erstellt | bearbeitet | freigegeben
    Überschrift zu Artikel3 | Link zu Artikel3 | Max Mustermann | erstellt | bearbeitet | freigegeben
    Überschrift zu Artikel4 | Link zu Artikel4 | Georg Geldsack | erstellt | bearbeitet | freigegeben
    Überschrift zu Artikel5 | Link zu Artikel5 | Otto Normalverdiener | erstellt | bearbeitet | freigegeben
    Überschrift zu Artikel6 | Link zu Artikel6 | Otto Normalverdiener | erstellt | bearbeitet | freigegeben



  • Ok, jetzt versteh ich was du meinst 🙂

    SELECT 
      art.ueberschrift, 
      art.erstellt, 
      art.bearbeitet, 
      art.freigabe 
      art.autor 
      men.linkname, 
      ben.benutzername 
    FROM 
      artikel art, 
      menu men, 
      benutzer ben 
    WHERE 
      art.artikel_id = men.linkziel
    #Benutzertabelle dazujoinen
      AND
      art.autor = ben.benutzer_id
    ORDER BY 
      ueberschrift DESC
    


  • Danke, wäre aber nicht mehr nötig gewesen ;-). Ich habe die Lösung auch schon gefunden. Allerdings schon bevor ich den Post eröffnet hatte. Allerdings wurden mir da 121 Zeilen ausgegeben, obwohl nur 3 gespeichert waren. Keine Ahnung warum

    Trotzdem danke!!

    MfG CSS



  • Bin mir gerade nicht ganz sicher, wie das ist, wenn du einfach mehrere Tabellen kommasepariert angibst - afaik wird da dann das karthesische Produkt gebildet, was sehr schnell zu extrem riesigen Tabellen führt. Besser ist es, wenn du dierekt den entsprechenden JOIN angibst z.B. LEFT JOIN etc.



  • Aber, das ist doch einfach nur der >>Theta-Stil<<. Ich habe noch nie gehört, dass es einen Unterschied mach ob ich jetzt mit JOIN ... ON oder eben mit Kommas arbeite. Hast du da Quellen?

    MfG CSS





  • habs jetzt nicht getestet.
    Evtl. so?

    Benötigt aber noch eine zusätzliche Tabelle "Autor", die jeder
    Autorennummer einen Namen zuordnet:

    SELECT
      art.ueberschrift,
      art.erstellt,
      art.bearbeitet,
      art.freigabe
    --art.autor liefert ja nur die Nummer vom Autor
      autor.name,
      men.linkname,
      ben.benutzername
    FROM
      artikel art,
      menu men,
      benutzer ben
    JOIN autor ON autor.nummer = art.autor
    WHERE
      art.artikel_id = men.linkziel
    ORDER BY
      art.ueberschrift DESC
    


  • SELECT
      art.ueberschrift,
      art.erstellt,
      art.bearbeitet,
      art.freigabe,
      art.autor,
      men.linkname,
      ben.benutzername
    FROM
      artikel art,
      menu men
    JOIN
      benutzer ben
    ON
      ben.benutzer_id = art.autor
    WHERE
      art.artikel_id = men.linkziel
    ORDER BY
      ueberschrift DESC
    

    Diese Abfrage ist gegenüber meiner ursprünglichen genau um 0.000007 Sekunden schneller, bei 100 Datensätzen. Möglicherweise galt, das bei alten MySQL Versionen.

    MfG CSS


Anmelden zum Antworten