Left Join Abfrage ? Oder warum geht es auch ohne ?
AndreasN
- datenbank
Holla,
ich habe folgende Struktur:
Tabelle 1 ( themen )
-------------------------------
| id | themenid | titel | usw
-------------------------------
Tabelle 2 ( beitrag )
---------------------------------------
| beitragsid | themenid | text | usw
---------------------------------------
Tabelle 3 ( zusatz )
---------------------------------------
| zusatzid | beitragsid | zusatzart | usw
---------------------------------------
Jetzt habe ich die "zusatzid" vorhanden und brauche aber den "Titel" aus der themen Tabelle.
SELECT titel FROM bb1_threads, bb1_posts, zusatz
WHERE zusatz.zusatzid=?
AND zusatz.beitragsid=beitrag.beitragsid
AND themen.themenid=beitrag.themenid
Damit funktioniert es. Jetzt gäbe es da ja ( soweit ich das mit "JOIN" richtig verstanden habe ) die Möglichkeit dies auch mit LEFT JOIN zu lösen. Aber:
1. WIE ?
2. Welchen Vorteil habe ich davon ?
Zu 1. Ich wäre mehr als dankbar wenn mir jemand ( vielleicht auch anhand des BSP ) die Left join Funktion erklären könnte, denn was Dokus angeht, habe ich schon so ziemlich viele gelesen so dass ich da entweder zu d... bin um das zu verstehen oder aber schlicht und einfach in diesem Zusammenhang immer ein "Brett vorm Kopf" hab.
Für jede Art von Hilfe schon mal vielen Dank im voraus ;)
MfG
AndreasN
Yo,
man unterscheidet die art der joins. deine select abfrage ist ein sogenannter "inner join" (equi, natural). Joins haben zu eigen, dass sie immer über mehr als eine tabelle gehen und somit beziehungen abbilden können, zum beispiel 1:n (Ein vater kann mehrere Kinder haben, aber in der Regel hat ein kind nur einen vater). solch eine beziehung der natürlichen vermehrung lassen sich eben über zwei tabellen darstellen. in der einen stehen die männer und in der anderen die kindern. in der kindtabelle würde dann der fremd oder bezugsschlüssel stehen, um festzulegen, wer der Vater des jeweiligen kind ist.
nun gibt es neben dem gemeinen klapperstorch (in wahrheit der datenbank-administrator), der die kinder einfach vertauscht noch andere probleme, die sich mit einem inner join nicht lösen lassen. damit kannst du zwar alle väter mit ihren kindern auflisten, aber die männer, die noch gar keine kinder haben, fallen unter dem tisch, da ja niemals der primär und der fremdschlüssel bei ihnen gleich sind (siehe gleichheitszeichen).
dafür gibt es einen outer join (left oder right). Der left join macht nun folgendes. er nimmt alle datensätze --> männer aus der linken tabelle, egal ob sie nun ein kind haben oder nicht. hat er kinder in der anderen tabelle, werden diese aufgelistet, anderfals bleibt diese spalte einfach leer. aber du hast auf jeden fall alle männer an board.
Ilja
Holla,
erst mal Danke für Deine Antwort.
Hmmmm *kopfrauchzeichengeb*
Ob nun Beitrags -und themenID oder Väter mit ihren Kindern, die Funktion habe ich ja schon mal verstanden, nur dummerweise nicht den Sinn ( wenn es auch ohne ging ) und vor allem nicht WIE es funktioniert
MfG
AndreasN
hi Andreas,
Ob nun Beitrags -und themenID oder Väter mit ihren Kindern, die Funktion habe ich ja schon mal verstanden, nur dummerweise nicht den Sinn ( wenn es auch ohne ging ) und vor allem nicht WIE es funktioniert
was den sinn betrifft, so ist die frage einfach zu beantworten. du kannst nicht alles mit einem inner join darstellen und brauchst für manche lösungen einen outer join.
ich will es auf deine ersten beiden tabellen übertragen und versuchen zu erklären. wenn du alle themen aus der ersten tabelle auflisten willst und die anzahl der beiträge, die sie haben, dann geht das nur mit einem outer join. würdest du das mit einen inner join machen, würde alle themen, die keine beiträge haben, durch den inner join nicht erfasst werden, also praktisch unter dem tisch fallen. aber auch diese sollen angezeigt werden. und genau das macht der outer join. er nimmt alle datensätze aus der ersten tabelle, egal ob in der zweiten tabelle ein bezug darauf ist oder nicht.
Ilja