顺序连接的左连接结果

Posted

技术标签:

【中文标题】顺序连接的左连接结果【英文标题】:Order concatenated left join results 【发布时间】:2017-12-08 03:08:26 【问题描述】:

我有以下表格:

Table: person
 id  |  name
  1  |  John
  2  |  Ana
  3  |  Thomas

Table: fruit 
 id  |  name
  1  |  orange
  2  |  banana
  3  |  grapefruit
  4  |  lemon
  5  |  apricot

Table: person_fruit
person_id | fruit_id
    1     |     1
    1     |     3
    2     |     1
    2     |     2
    1     |     5

如您所料,person_fruit 表用作多对多关系。

我正在做一个查询,列出所有的人和他们最喜欢的水果串联在一个字符串中。我的问题是我无法显示按水果名称排序的他们最喜欢的水果,例如:

John   | apricot, grapefruit, orange
Ana    | banana, orange
Thomas | NULL

我当前的 mysql 查询如下所示:

SELECT 
  p.name, 
  GROUP_CONCAT(f.name SEPARATOR ', ') fruit
FROM
  person p
LEFT JOIN person_fruit pf
  ON p.id = pf.person_id
LEFT JOIN `fruit` `f`
  ON f.id = pf.fruit_id
GROUP BY
  p.id

如何对串联的左连接结果进行排序?

【问题讨论】:

【参考方案1】:

您可以在 GROUP_CONCAT 中使用 ORDER BY。

p.name 也应该在 GROUP BY 子句中

SELECT 
  p.name, 
  GROUP_CONCAT(f.name  ORDER by f.name ASC SEPARATOR ',') fruit
FROM
  person p
LEFT JOIN person_fruit pf
  ON p.id = pf.person_id
LEFT JOIN `fruit` `f`
  ON f.id = pf.fruit_id
GROUP BY
  p.name

【讨论】:

以上是关于顺序连接的左连接结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥Mysql的左连接条件不被遵守?

PostgreSQL - 带有错误计数输出的左连接

中小型表上的左连接非常慢

数据库中的左连接(left join)和右连接(right join)区别

SQL 将 MAX 应用于具有非空行的左连接表

mysql中的左连接和右连接有啥区别[重复]