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