kimaro
Goto Top

Join über drei Tabellen

Hallo Admins,

ich versuche gerade eine SQL Abfrage für meine Website zu basteln, aber irgendwie klappt das nicht so ganz. Den Aufbau der Tabellen habe ich mal als Bild hinzugefügt als Designer Import aus phpmyadmin.
Mein Ziel ist es eine SQL Abfrage zu machen die folgendes Ergebnis bringt:
Nachname Titel Vote
1 1 1
1 2 NULL
2 1 NULL
2 2 1


Also soll in der Abfrage geprüft werden, welcher User wie für welches Lied gevotet hat und ob er überhaupt gevotet hat.

Vielen Dank schonmal für eure Hilfe
tabellen

Content-ID: 335322

Url: https://administrator.de/contentid/335322

Ausgedruckt am: 08.11.2024 um 05:11 Uhr

SeaStorm
SeaStorm 15.04.2017 um 10:09:40 Uhr
Goto Top
Select * from users
left join votes on users.id=vote.userid
Inner join vote.musikid=Musik.id

So was. Left join nimmt dir alles aus einer Tabelle und gibt es auch aus, wenn kein Datensatz auf der gejointen Tabelle dazu existiert
Kimaro
Kimaro 15.04.2017 um 10:46:31 Uhr
Goto Top
Vielen Dank schonmal für deine Antwort,

ich habe das eben ausprobiert, es ist jedoch noch nicht das was ich haben möchte. Es soll für jeden User zu jedem Titel einen Eintrag für Vote geben, der auch NULL sein kann, wenn noch kein Datensatz in der Tabelle votes besteht. Kannst du mir da vielleicht nochmal helfen?

Vielen Dank nochmal
em-pie
em-pie 15.04.2017 um 13:33:33 Uhr
Goto Top
Moin,

Am besten, du postest mal dein bisheriges Statement.

Neben einem LEFT JOIN gibt es ja auch noch - wer hattest es gedacht - ein RIGHT JOIN, und je nachdem, wie rum dein JOIN aufgebaut ist, muss man da dann mal schauen.

Google einfach mal im WWW nach den verschiedenen JOIN Möglichkeiten, dann wird dir so manches klarer;)

Gruß
em-pie
Biber
Lösung Biber 15.04.2017 um 17:09:02 Uhr
Goto Top
Moin Kimaro,

wenn du alle Datensätze aus USERS und alle Datensätze aus MUSIK brauchst und zusätzlich eine Information aus VOTES, falls vorhanden,,,
-> Dann ist die Übersetzung in SQL-Vokabeln ein CROSS JOIN von USERS und MUSIK und auf das Ergebnis ein LEFT JOIN auf VOTES.

CROSS JOIN heisst nix weiter als "jeder Datensatz mit jedem Datensatz aus der anderen Tabelle verbunden" . Bei 10 Usern und 10 Musikangeboten bekommst du also 100 Ergebniszeilen.

 
SELECT uxm.*, v.vote FROM (
SELECT u.id as userid, u.vorname, u.nachname, m.id as musikid, m.title, m.interpret  
FROM Users u, musik m ) as uxm
LEFT JOIN votes v on uxm.userid=v.userid  and uxm.musikid=v.musikid
ORDER BY  uxm.nachname, uxm.vorname, uxm.interpret, uxm.title ;

Der Alias "uxm" ergab sich als "users cross musik" quasi von selbst.

Grüße
Biber
Kimaro
Kimaro 15.04.2017 um 22:42:49 Uhr
Goto Top
Das ist ja der Hammer!! Ich danke dir sehr, es ist eine perfekte Lösung und ich habe sogar verstanden was du in deiner Abfrage machst. Super Erklärung dazu!

Gruß Kimaro