MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接
Posted
技术标签:
【中文标题】MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接【英文标题】:MYSQL: LEFT JOIN on TWO TABLES USED with Group_Concatenate 【发布时间】:2016-09-21 23:55:19 【问题描述】:我正在对一个表运行查询,我还想从两个相关表中获取相关信息,这两个表相对于主表是多对一的。
然后我通过 JSON 将此信息发送到应用程序,因此我将 group_concatenating 来自其他表的多个值。它适用于一个额外的表。但是,当我添加第二个表时,我得到了两个额外表的所有我不想要的副产品。
谁能建议如何只获取连接字段的唯一值?
//current sql
$sql = SELECT c.*,group_concat(p.name) as `names`,
group_concat(l.location) as `locations`
FROM companies `c`
LEFT JOIN people `p`
ON p.companyid = c.id
LEFT JOIN locations `l`
ON l.companyid = c.id
GROUP by c.id;
输出基本上按我不关心的位置复用每个名称的重复值(并且对位置执行相同的操作)。
代替
"names":"John,Joe,Jim,Tom,Bob","locations":"Tokyo,London,Manila,Paris,Milan",
输出是"names";"John,John,John,John,John,Joe,Joe,Joe,Joe,Joe,...etc.
感谢您提供有关正确方法的任何建议。 编辑:示例数据
Companies
id|company|
1|IBM
2|Google
3|Apple
4|Amazon
People
id|name|companyid
1|John|1
2|John|2
3|Jim|3
4|Bob|4
5|Tom|4
Locations
id|name|companyid
1|London|1
2|Cupertino|3
3|Seattle|3
Desired output:
company:IBM, people:John, location:London
company:Google, people: John location: null
company:Apple, people:Jim location: Cupertino
copany:Amazon, people:Bob,Tom location:Seattle
【问题讨论】:
您可以将 DISTINCT 与 GROUP_CONCAT 一起使用来消除重复项,但不太确定这是您想要的。通常,当我需要这样的东西时,是因为我需要一个配对值列表,在这种情况下,我在 2 个字段上使用了 CONCAT(),然后在结果值上使用了 GROUP_CONCAT。 如果您向我们展示样本输入数据,这些数据会生成不需要的重复名称,这会很有帮助。 Distinct 可能会做到这一点,但如果一家公司真的有两个人叫 John,或者两个叫 Green Acres 的地方,我都想要。基本上,我希望每家公司都有独特的人员和独特的位置。 添加了示例数据。 我不会那样做。只需返回一个 DISTINCT 有序数组,并使用 json_encode - 所以这些 GROUP_CONCAT 废话都没有 【参考方案1】:技术上DISTINCT
应该可以工作:
http://sqlfiddle.com/#!9/5f8074/1
SELECT c.*,
GROUP_CONCAT(DISTINCT p.name) as `names`,
GROUP_CONCAT(DISTINCT l.name) as `locations`
FROM companies `c`
LEFT JOIN people `p`
ON p.companyid = c.id
LEFT JOIN locations `l`
ON l.companyid = c.id
GROUP by c.id;
但是根据您的评论,即使有一些重复,您也想分组。
这种情况下可以设置子查询:
SELECT c.*,
(SELECT GROUP_CONCAT(p.name) FROM people p WHERE c.id=p.companyid) as `names`,
GROUP_CONCAT(DISTINCT l.name) as `locations`
FROM companies `c`
LEFT JOIN locations `l`
ON l.companyid = c.id
GROUP by c.id;
【讨论】:
以上是关于MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接的主要内容,如果未能解决你的问题,请参考以下文章