SQL将列中的多个值连接到一个单元格中

时间:2009-07-20 05:21:00

标签: sql mysql join left-join

已经有很多sql join q了,但我没有看到我的答案,所以这里有。 。 。我正在使用WPDB(Wordpress数据库)/ EZSql / MySQL 5.0。试图在下面实现“简单”的期望输出并不容易。

当前输出

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并在我之后模拟了我的问题,但我不明白他们的解决方案,我希望能有更简单的事情。

5 个答案:

答案 0 :(得分:4)

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;

答案 1 :(得分:2)

鉴于您正在使用mySQL,我相信group_concat函数将完全符合您的要求:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

从db中获取行或将其呈现给用户时,可以连接各种成果。我建议使用后者,因为它更像是一个视图逻辑问题。

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

如果你只提取一个成员,你也可以通过使用一个变量在SQL中完成它,而不是确切的MySQL语法,但对于MSSQL,它将是这样的:

DECLARE @frutis VARCHAR(MAX)

SELECT @fruits = ISNULL(@fruits + ', ' + FruitName, FruitName)
FROM ... 

SELECT @fruits

答案 4 :(得分:0)

@Adam 我知道回答可能会迟到但是我遇到了同样的问题,所以这是我的解决方案,以扩展迈克回答并解决多个相同的果实出现:

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

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

我希望有所帮助。