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 一起使用的两个表上的左连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的安装与配置

MySQL的安装与配置

MySQL的安装与配置

PHP数据库连接mysql与mysqli的区别与用法

MySQL的安装与配置及登陆与退出

mysql与mysqli区别