【问题标题】:SQL join multiple values from column into one cellSQL将列中的多个值连接到一个单元格中
【发布时间】:2010-11-12 05:11:25
【问题描述】:

已经有大量的 SQL JOIN 问题,但我没有看到我的答案,所以就这样吧。

我正在使用帮助类 wpdb 和 ezsql 处理 MySQL 5.0 和 Wordpress 数据库。事实证明,尝试实现下面的“简单”期望输出并不容易。

当前输出:

MemberID          MemberName              FruitName
--------------    ---------------------   --------------
1                  Al                     Apple
1                  Al                     Cherry

期望的输出:

MemberID           MemberName            FruitName
-----------        --------------        ------------
1                  Al                    Apple, Cherry

MemberID 来自a 表,MemberName 来自a 和b 表,FruitName 来自b 表。因为我从表a 中输出了很多其他列,所以我通过这个查询“左连接”了这两个表:

$contents = $wpdb->get_results( $wpdb->prepare("SELECT * FROM a LEFT JOIN b ON a.MemberName = b.MemberName"));

我稍后使用 echo 打印列:

        <td><?php echo $content->MemberID ?></td>
        <td><?php echo $content->MemberName ?></td>
        <td><?php echo $content->FruitName ?></td>

我认为我应该尝试以不同的方式查询/连接这两个表,尽管在打印列时可能会获得创造性。我找到了这个discussion here 并模仿了我的问题,但我不明白他们的解决方案,希望有更简单的解决方案。

【问题讨论】:

    标签: sql mysql join left-join


    【解决方案1】:

    GROUP BY MemberName 和 GROUP_CONCAT(FruitName)。例如,

    SELECT MemberId, MemberName, GROUP_CONCAT(FruitName) FROM a LEFT JOIN b ON a.MemberName = b.MemberName GROUP BY a.MemberName;
    

    【讨论】:

    • 嗯,试了一下,得到一个错误,说 MemberName 是一个不明确的字段,所以我将 SELECT MemberID, MemberName 更改为 SELECT MemberID, a.MemberName,我的输出看起来像这样:MemberID MemberName GROUP_CONCAT (FruitName) 1 Al [BLOB - 3 B]
    • 我试图简化问题,但最终没有得到与我的工作数据库直接相关的答案。所以我创建了我在这里演示的表格并让它工作......一个问题:group_concat 函数将每个水果拉两次!我将开始一个新问题,因为谷歌没有结果(没有双关语)。谢谢!
    【解决方案2】:

    鉴于您使用的是 MySQL,我相信 GROUP_CONCAT 函数之一(可用的 aggregate functions 之一)将完全满足您的需求。

    【讨论】:

      【解决方案3】:
      SELECT MemberID, MemberName, GROUP_CONCAT(FruitName SEPARATOR ',') FROM a LEFT JOIN b ON a.MemberName = b.MemberName GROUP BY MemberID, MemberName;
      

      【讨论】:

      • 遇到了与下面完全相同的问题
      【解决方案4】:

      一种方法是在 PHP(或您使用的任何语言)中循环和构建输出。

      在从 db 获取行或将其呈现给用户时连接水果。我建议后者,因为它更多的是一个视图逻辑问题。

      如果您想在 SQL 中执行此操作,您要么必须创建自己的(我不相信 MySQL 内置了它,但我可能错了)聚合函数来连接字符串。这不是那么微不足道。

      如果你只获取一个成员,你也可以在 SQL 中使用一个变量来完成,我不确定确切的 MySQL 语法,但对于 MSSQL,它会是这样的:

      DECLARE @frutis VARCHAR(MAX)
      
      SELECT @fruits = ISNULL(@fruits + ', ' + FruitName, FruitName)
      FROM ... 
      
      SELECT @fruits
      

      【讨论】:

        【解决方案5】:

        @亚当 我知道回答可能会晚,但我遇到了同样的问题,所以这是我扩展 Mike 答案并解决多个相同水果出现的解决方案:

        SELECT MemberId, MemberName, GROUP_CONCAT(distinct FruitName) FROM a LEFT JOIN b ON a.MemberName = b.MemberName GROUP BY a.MemberName;
        

        所以基本上你只需要在 GROUP_CONCAT 函数中添加“distinct”即可。

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-17
          • 2021-09-22
          • 1970-01-01
          • 2014-08-12
          • 1970-01-01
          • 2016-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多