2016-07-23 108 views
3

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

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"; 
+0

请发布图像中的文字作为文本 – e4c5

+0

完成后,希望这样可以 – Exxeca

+0

您可以显示表格的结构吗? – Philipp

回答

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

解释:

这里我们使用的是内部联接,你不会得到任何重复。并返回由KommentarID分组级联kommentare子查询使用具有可以限制数量的评论

+0

这里的问题是只显示带有注释的歌曲。但是,有歌曲没有评论(因此没有KommentarID)。 – 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

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

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

缺少“actual”KommentarID - kommentare表中的primary key是什么?一个auto_incrementintprimary key会感觉非常直观。

它会再看看魔神此: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

我几乎将Schema复制到phpmyadmin和SQL到我的php文件中,仍然不起作用:/ – Exxeca

+0

差不多? :p好吧,只需花时间调试它 - 如果你想改变结构。如果需要,您可以逐一执行这些步骤,因为我只在“kommentare”中添加了一列,并将两个表中的songideenID重命名。虽然“不起作用”是什么意思?错误的结果? – Philipp

+0

是的,我只需要一些时间进行调试。但感谢您的帮助! :-)另一个小问题:在表格“kommentare”中添加另一行“用户”来显示谁写了这个评论的最佳方式是什么?我可能也需要GROUP_CONCAT,对吧? – Exxeca

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表中的记录将导致NULL的值为kommentare.kommentarID。因此,您的最终结果集将包含那些在kommentare表中具有相应注释的记录,以及在kommentare表中找到的所有NULL条目的一个条目。

相关问题