【问题标题】:Merge mysql rows with same id using 2 tables使用2个表合并具有相同ID的mysql行
【发布时间】:2016-07-23 09:23:30
【问题描述】:

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

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

【问题讨论】:

  • 请将图片中的内容作为问题中的文本发布
  • 完成,希望没问题
  • 你能展示一下表格的结构吗?

标签: php mysql join merge rows


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

【讨论】:

    【解决方案2】:

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

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

    解释:

    这里我们使用的是内连接,你不会得到任何重复。并使用你可以限制数量 cmets

    【讨论】:

    • 这里的问题是只显示带有 cmets 的歌曲。但是存在没有评论的歌曲(因此没有 KommentarID)。
    【解决方案3】:
    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 在子查询上返回由KommentarID 分组的串联kommentare

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

    kommentare.KommentarID - 这似乎不是kommentare 的实际标识符,而是对应songideen.id 的id,所以这应该叫songideenID 所以你可以很容易地看到,这是建立表之间关系的列。

    缺少“实际”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)
    

    【讨论】:

    • 我几乎将 Schema 复制到 phpmyadmin 并将 SQL 复制到我的 php 文件,仍然无法正常工作:/
    • 几乎? :p 好吧,只要花点时间调试它——如果你想改变结构。如果需要,您可以逐个执行这些步骤,因为我只在 kommentare 中添加了一列,并在两个表中重命名了 songideenID。虽然“不起作用”是什么意思?结果错误?
    • 是的,我只是需要一些时间来调试。但是感谢您的帮助! :-) 另一个小问题:在“kommentare”表中添加另一行“用户”以显示谁写了此评论的最佳方法是什么?为此,我可能还需要 GROUP_CONCAT,对吧?
    • 取决于您拥有的数据。如果user 是您的数据库中的一个自己的实体(有一个user 表),您将userId 放入kommentare。如果您有一个带有输入字段的在线表单,我可以在评论时写一些随机名称,那么只需将名称写入该字段就足够了。
    • 对于这两种情况,查询看起来会有些不同,如果它“只是”一个名称,后面没有数据库实体,您可以将 group_concat 添加到子查询中。如果涉及user 表,则在子查询中加入它,然后在名称字段中加入group_concat
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2023-03-08
    • 2020-12-23
    • 2013-09-01
    • 2016-12-27
    • 2021-11-02
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多