使用2个表合并具有相同id的mysql行

时间:2016-07-23 09:23:31

标签: php mysql join merge rows

我有一个带有2个表的mysql数据库:songideen,kommentare。在“songideen”中你可以存储歌曲,在“kommentare”你可以评论它们。两个表都通过LEFT JOIN链接。 如何合并行(如果一首歌有2个或更多的评论)所以所有评论都在一行中用','分隔?在这个例子中,我想组合第二行和第三行:

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

我alrady以这种方式尝试过,但它不起作用:

 $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";

3 个答案:

答案 0 :(得分:1)

您需要按songideen.ID进行分组。由于songideen表中有记录,kommentare表中没有任何注释。

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 ;

注意:

在您的情况下,您正在按kommentare.kommentarID对结果集进行分组。对于songideen表中没有kommentare表中任何评论的记录,NULLkommentare.kommentarID。因此,您的最终结果集将包含kommentare表中具有相应注释的记录以及NULL表中找到的所有kommentare条目的一个条目。

答案 1 :(得分:0)

对您的输出使用以下查询。

$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
                ";

说明:

这里我们使用内连接你不会得到任何重复。使用你可以限制数字评论

答案 2 :(得分: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在子查询上返回按kommentare分组的连续KommentarID

但是,你应该重新设计你的表格设计,或者至少改变一些列的名称。

kommentareKommentarID - 这似乎不是kommentare的实际标识符,而是相应songideen的ID。{{1所以这应该被称为id所以你可以很容易地看到,这是建立表之间关系的列。

缺少"实际" KommentarID - songideenID表中的primary key是什么? kommentare auto_increment int会非常直观地感受到。

然后它会看起来像这样:http://sqlfiddle.com/#!9/150e7/4

primary key