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

Php 使用2个表合并具有相同id的mysql行,php,mysql,join,merge,rows,Php,Mysql,Join,Merge,Rows,我有一个mysql数据库,有两个表:songideen、kommentare。在“songideen”中你可以储存歌曲,在“kommentare”中你可以评论歌曲。两个表都通过左联接链接。 如何合并行(如果一首歌曲有2个或更多的评论),以便所有评论在一行内以“,”分隔?在本例中,我希望合并第二行和第三行: Name Arbeitstitel Datum mp3 ID Kommentare KommentarID Lukas Titeltest 2016

我有一个mysql数据库,有两个表:songideen、kommentare。在“songideen”中你可以储存歌曲,在“kommentare”中你可以评论歌曲。两个表都通过左联接链接。 如何合并行(如果一首歌曲有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
我试过这种方法,但不起作用:

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

对输出使用以下查询

$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
                ";
说明:

在这里,我们使用内部连接,您将不会得到任何重复。使用have可以限制评论的数量

SELECT
  *
FROM songideen
LEFT JOIN (SELECT
  GROUP_CONCAT (kommentare SEPARATOR ','), KommentarID
FROM kommentare
GROUP BY KommentarID) AS kommentare
  ON kommentare.KommentarID = songideen.id
子查询上的
左联接
,该子查询返回按
KommentAnd
分组的串联的
kommentare

但是tbh,您应该重新设计表,或者至少更改一些列的名称

kommentare
kommentand
-这似乎不是
kommentare
的实际标识符,而是相应的
songideen
id的id,因此应将其称为
songideenID
,以便您很容易看到,这是构建表之间关系的列

缺少“实际”kommentare-您的
kommentare
表中的
主键是什么?
自动增量
int
主键
的感觉非常直观

然后看起来像这样:


您需要按
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.kommentand
对结果集进行分组的。对于
songideen
表中的记录,如果
kommentare
表中没有任何注释,则将导致
NULL
kommentare.kommentand
。因此,您的最终结果集将包括那些在
kommentare
表中有相应注释的记录,以及在
kommentare
表中找到的所有
NULL
条目的一个条目。

请将图像中的任何内容作为问题完成中的文本发布,希望这样可以,你能显示表格的结构吗?这里的问题是只显示带有注释的歌曲。但是有些歌曲没有注释(因此也没有Kommentand)。我几乎将模式复制到phpmyadmin,将SQL复制到我的php文件,仍然不起作用:/near?:如果你想改变结构,那就慢慢调试吧。如果需要,您可以逐个执行这些步骤,因为我只在
kommentare
中添加了一列,并在两个表中重命名了SongidenID。“不起作用”是什么意思?错误的结果?是的,我只是需要一些时间来调试。但是谢谢你的帮助!:-)另一个小问题:在表“kommentare”中添加另一行“User”以显示谁写了此评论的最佳方式是什么?我可能也需要小组讨论,对吗?取决于你有什么数据。如果
user
是数据库中自己的实体(有一个
user
表),则将用户ID带入
kommentare
。如果您有一个带有输入字段的在线表单,在这里我可以在评论时写入一些随机名称,只需将名称写入该字段就足够了。对于这两种情况,查询看起来都有点不同,如果它“只是”一个名称,后面没有数据库实体,您可以将
组_concat
添加到子查询中。如果涉及到
用户
表,则在子查询中加入该表,然后在名称字段中加入
组。
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 ;