MySQL Join über 3 Tabellen

slimox

Mitglied
Hallo zusammen,

Ich versuche mit einer SQL Abfrage eine Tabelle mit Zeilen = Besucher, Spalten = Tage zu erstellen. Die Besucher und die Tage sind immer vorhanden.
Jetzt kommt die dritte Tabelle dazu. Die Tabelle Tage_Besucht ist mit der ID vom Besucher und vom Tag verknüpft. Es muss keine Verknüpfung für jeden Teilnehmer und Tag geben.

Meine Idee:
Die SQL Abfrage gibt den Namen vom Teilnehmer und für alle Tage das Feld `description` zurück. Ist keine Verknüpfung vorhanden, dann gibt es an diesem Tag NULL oder '' aus.

Hier habe ich einen SQL Fiddle mit dem Demo Daten erstellt:
http://sqlfiddle.com/#!9/52e73

Diese Tabelle sollte es Ausgeben:
UserA / AAA / XYZ / NULL
UserB / BBB / NULL / NULL
UserC / ABC / NULL / NULL

Sollte doch nicht so schwierig sein, jedoch bekomme ich es einfach nicht hin.. :( Hoffe jemand hat mir einen Tipp? DANKE!
 
MySQL Kennt mWn kein Crossquery/Pivot.
Darum muss man das von Hand machen
SQL:
SELECT
  b.username,
  -- Klassiche CASE WHEN  
  MAX(CASE 
    WHEN tb.tag_id = 1
    THEN tb.description
  END) AS tag_1,
  -- über den IF(). Ist sehr MySQL Spezifisch
  MAX(IF(tb.tag_id = 2, tb.description, NULL)) AS tag_2,
  -- Andere Variante von CASE WHEN
  MAX(CASE tb.tag_id WHEN 3 THEN tb.description END) AS tag_3
FROM
  tage_besucht AS tb
  LEFT JOIN besucher AS b
    ON tb.user_id = b.user_id
GROUP BY
  b.user_id,
  b.username

http://sqlfiddle.com/#!9/52e73/3
 
Danke für deine Antwort! Bei deiner Lösung sind die Tag nicht verJoint. Siehst du eine Möglichkeit, die Tage aus der Tabelle zu lesen??
 
Nur wenn du das SQL mittels PHP zusammen schusterst

Nehmen wir die Variante IF()
Dann iterierst du über die Tage und setzt den SELECT-Teil zusammen

So auf die schnelle. Es kann sein, das einige Befehle falsch sind. Ich habe schon länger kein PHP mehr programmiert
PHP:
]$columnsA= array();
while ($row = mysqli_fetch_assoc($result)) {
    $columnsA[] = "MAX(IF(tb.tag_id = {$row['tag_id']}, tb.description, NULL)) AS tag_{$row['tag_id']}";        
}
$columnsS = implode(', ', $columnsA) 
$sql = <<<SQL
SELECT
  b.username,
  {$columnsS}
FROM
  tage_besucht AS tb
  LEFT JOIN besucher AS b
    ON tb.user_id = b.user_id
GROUP BY
  b.user_id,
  b.username
SQL;
 
Zurück