2016-07-23 16 views
3

Ich habe eine MySQL-Datenbank mit 2 Tabellen: songideen, kommentiere. In "songideen" können Sie Songs speichern, in "kommentare" können Sie sie kommentieren. Beide Tabellen sind über LINKER JOIN verbunden. Wie werden die Zeilen zusammengefügt (falls ein Lied 2 oder mehr Kommentare hat), so dass alle Kommentare durch ',' innerhalb einer Zeile getrennt sind? In diesem Beispiel möchte ich die zweite und die dritte Reihe kombinieren:Mysql Zeilen mit der gleichen ID mit 2 Tabellen verschmelzen

Name Arbeitstitel Datum  mp3 ID Kommentare KommentarID 
Lukas Titeltest 2016-06-06 Link  1 comment  1 
Jannik Titeltest2 2016-07-06 Link2 2 comment2  2 
Jannik Titeltest2 2016-07-06 Link2 2 comment3  2 
Andi Titeltest3 2016-07-20 Link3 3 comment4  3 

ich es auf diese Weise alrady versucht, aber es funktioniert nicht:

$sql = "SELECT songideen.Name, songideen.Arbeitstitel, songideen.Datum, songideen.mp3, songideen.ID, GROUP_CONCAT(kommentare.Kommentar SEPARATOR ',') AS KommentarIDs, kommentare.KommentarID 
       FROM songideen 
       LEFT JOIN kommentare 
       ON songideen.ID=kommentare.KommentarID 
       GROUP BY kommentare.KommentarID"; 
+0

bitte posten was immer das ist in dem Bild als Text in der Frage – e4c5

+0

Fertig, hoffe, das ist in Ordnung so – Exxeca

+0

Können Sie die Struktur der Tabellen zeigen? – Philipp

Antwort

0

Verwendung folgenden Abfragen für die Ausgabe.

$sql = "SELECT s.Name, s.Arbeitstitel, s.Datum, s.mp3, s.ID, GROUP_CONCAT(k.Kommentar SEPARATOR ',') AS KommentarIDs, k.KommentarID,(SELECT count(*) FROM kommentare where KommentarID= s.ID) as commentCount 
       FROM songideen s , kommentare k 
       where s.ID=k.KommentarID    
       GROUP BY k.KommentarID 
        having commentCount>2 
       "; 

Erklärung:

hier sind wir mit INNER JOIN Sie erhalten keine Duplikate erhalten. und unter Verwendung Haben Sie Zahl beschränken können Kommentare

+0

Das Problem hier ist, dass nur Songs mit Kommentaren angezeigt werden. Aber es gibt Lieder ohne Kommentar (und daher ohne KommentararID). – Exxeca

0
SELECT 
    * 
FROM songideen 
LEFT JOIN (SELECT 
    GROUP_CONCAT (kommentare SEPARATOR ','), KommentarID 
FROM kommentare 
GROUP BY KommentarID) AS kommentare 
    ON kommentare.KommentarID = songideen.id 

LEFT JOIN auf einer Unterabfrage, die die verketteten kommentare kehrt gruppiert durch die KommentarID.

Aber tbh, sollten Sie Ihr Tabellendesign überarbeiten, oder zumindest einige Spaltennamen ändern.

kommentare. KommentarID - Dies scheint nicht der tatsächliche Bezeichner für kommentare, aber ist die ID der entsprechenden songideen. id, so sollte dies songideenID genannt werden, so können Sie leicht sehen, das ist die Spalte, die die Beziehung zwischen den Tabellen aufbaut.

Fehlende "aktuelle" KommentarID - was ist die primary key in Ihrer kommentare Tabelle? Ein auto_incrementintprimary key würde sehr intuitiv fühlen.

Es würde dann schauen diese loke: http://sqlfiddle.com/#!9/150e7/4

SELECT 
    * 
FROM songideen 
LEFT JOIN (SELECT 
    GROUP_CONCAT(Kommentare SEPARATOR ',') AS kommentar, songideenID 
FROM kommentare 
GROUP BY songideenID) AS kommentare USING(songideenID) 
+0

Ich kopiert fast das Schema zu phpmyadmin und die SQL in meine PHP-Datei, funktioniert immer noch nicht:/ – Exxeca

+0

fast? : P Nimm dir einfach Zeit beim Debuggen - wenn du die Struktur ändern willst. Sie können die Schritte eins nach dem anderen tun, wenn nötig, da ich nur eine Spalte zu "kommentare" hinzugefügt und die songideenID in beiden Tabellen umbenannt habe. Was bedeutet "funktioniert nicht"? falsches Ergebnis? – Philipp

+0

Ja, ich brauche nur etwas Zeit für das Debugging. Aber danke für deine Hilfe! :-) Eine weitere kleine Frage: Was ist der beste Weg, um eine weitere Zeile "Benutzer" in der Tabelle "kommentare" hinzuzufügen, um zu zeigen, wer diesen Kommentar geschrieben hat? Ich brauche wahrscheinlich auch GROUP_CONCAT dafür, oder? – Exxeca

1

Sie müssen Gruppe von songideen.ID. Da gibt es Datensätze in der songideen Tabelle ohne Kommentar in kommentare Tabelle.

SELECT 
    songideen.Name, 
    songideen.Arbeitstitel, 
    songideen.Datum, 
    songideen.mp3, 
    songideen.ID, 
    GROUP_CONCAT(kommentare.Kommentar SEPARATOR ',') AS KommentarIDs, 
    kommentare.KommentarID 
FROM songideen 
LEFT JOIN kommentare ON songideen.ID = kommentare.KommentarID 
GROUP BY songideen.ID ; 

Hinweis:

In Ihrem Fall das Ergebnis von kommentare.kommentarID gesetzt wurden Gruppierung. Für Datensätze in songideen Tabelle, die keinen Kommentar in der kommentare Tabelle haben, ergibt sich NULL Wert von kommentare.kommentarID. Ihre endgültige Ergebnismenge besteht also aus den Datensätzen mit entsprechenden Kommentaren in der Tabelle kommentare plus einem Eintrag für alle NULL Einträge in der Tabelle kommentare.