Antworten auf deine Fragen:
Neues Thema erstellen

Frage zu JOIN in SQL-Abfrage

Kerstin77

Flashfan

Hallo,

versuche gerade eine Planung für Referate aufzusetzen.

Die Struktur der DB sieht wie folgt aus:

Code:
referate   relations   personen
--------   ---------   --------
id         id          id
thema      referat_id   name
           person_id

Dazu die Abfrage:
PHP:
SELECT `referate`.`id`, `referate`.`thema`, `personen`.`name`
FROM `referate`
LEFT JOIN `relations` ON `relations`.`referat_id` = `referate`.`id`
LEFT JOIN `personen` ON `personen`.`id` = `relations`.`person_id`
ORDER BY `referate`.`id` ASC

Leider werden mir jedoch nur die Referante ausgegeben, denen auch schon eine Person zugeordnet ist. Wie bekomme ich alle Referate ausgelesen?

Kerstin
 
Zuletzt bearbeitet:

lachender_engel

Aktives Mitglied

Also ein Haken wird wohl sein, dass Du in Deiner Tabelle relations unter anderem das Feld
name_id hast aber in Deiner Abfrage `relations`.`person_id` verknüpfst. Dieses Feld person_id gibt es aber nicht.

Außerdem gibst Du an and
Code:
LEFT JOIN `personen` ON `personen`.`id` = `relations`.`person_id`
Wenn der Join fehlschlägt, dann wird gar nichts ausgegeben.
 

afr0kalypse

Allwissendes Karmameerschweinchen!

Deine Frage war: 'wie bekomme ich alle Referate ausgelesen?'
Die Antwort lautet: 'select * from referate;'
Du braucht keinen Join um alle Infos einer Tabelle auszulesen.
Willst du alle Infos einer Tabelle haben, machst du das mit select * from tabellenname;
Sollte das nicht funktionieren, hast du ein anderes Problem und müsstest uns genauer sagen, warum das nicht funktioniert (Fehlermeldung etc).
Willst du etwas anderes erreichen, so musst du deine Frage konkretisieren.
 

Kerstin77

Flashfan

Nein, ich möchte nicht alle Daten der Tabelle Referate auslesen, sondern alle vorhandenen Themen, auch wenn noch keine Person zugeordnet ist, die dieses Referat hät. Zusätzlich brauche ich in der gleichen Abfrage aber auch die Namen der Person(en), die dieses Referat halten.

Zur Zeit bekomme ich folgendes Ergebnis:
Code:
id    thema          name
---   ------------   ----
184   Webdesign      Klaus
185   HTML und CSS   Karsten
187   PHP            Jochen

Und diese Ausgabe wäre das Ziel:
Code:
id    thema          name
---   ------------   ----
184   Webdesign      Klaus
185   HTML und CSS   Karsten
186   JavaScript     NULL
187   PHP            Jochen

Sorry wenn ich mich etwas unklar ausgedrückt habe.
 

Kerstin77

Flashfan

Noch eine kleine Ergänzung:
Es funktioniert andersherum so wie gewünscht: wenn ich alle Namen mit den dazugehörigen Referaten ausgeben möchte, werden mir alle Namen geliefert, auch die, denen kein Referat zugeordnet ist:
PHP:
SELECT `personen`.`id`, `personen`.`name`, `referate`.`thema`
FROM `personen`
LEFT JOIN `relations` ON `relations`.`person_id` = `personen`.`id`
LEFT JOIN `referate` ON `referate`.`id` = `relations`.`referat_id`
 

Kerstin77

Flashfan

OK, werde ich mich mit beschäftigen. Frage mich aber nur, warum die Abfrage unter Post #9 folgendes Ergebnis (wie gewünscht) liefert:
Code:
id   name      thema
--   -------   ------------
1    Klaus     Webdesign
2    Oliver    NULL
3    Karsten   HTML und CSS
4    Jochen    PHP

Warum bekomme ich hier den Oliver mit ausgegeben, auch wenn ihm noch kein Referat zugeordnet ist? Wo ist der Unterschied?

Vielen Dank bis hierher schonmal!

Kerstin
 

afr0kalypse

Allwissendes Karmameerschweinchen!

du fragst deine tabellen von links nach rechts ab (left join)
1. alle namen ausgeben, die in personen vorkommen
2. alle ergebnisse verknüpfen mit allen person_id's, die in relations vorkommen

dein ergebnis müsste so aussehen:
Code:
select r.thema, p.name from personen as p
right join
relations as x on (p.id = x.person_id)
right join
referate as r on (x.referat_id = r.id)

oder anders (links) herum
Code:
select r.thema, p.name from referate as r
left join
relations as x on (r.id = x.referat_id)
left join
personen as p on (x.person_id = p.id)

zuerst holst du dir den bereich, wovon du dir alles anzeigen lassen willst. das sind deine themen.
von dort aus wird von links nach rechts zuerst zu den relationen verknüpft. und zwar jedes thema! so kommst du dann zu deinem null ergebnis.
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben