Php 使用2个表合并具有相同id的mysql行
我有一个mysql数据库,有两个表:songideen、kommentare。在“songideen”中你可以储存歌曲,在“kommentare”中你可以评论歌曲。两个表都通过左联接链接。 如何合并行(如果一首歌曲有2个或更多的评论),以便所有评论在一行内以“,”分隔?在本例中,我希望合并第二行和第三行: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
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 ;