带有大量左连接的 SQL 查询

Posted

技术标签:

【中文标题】带有大量左连接的 SQL 查询【英文标题】:SQL query with a lot of LEFT JOINS 【发布时间】:2017-08-17 10:23:58 【问题描述】:

我正在尝试整理一个查询,但结果不是我所期望的,

select pii.id, pii.name, pii.sku, group_concat(pic.id) category_ids, group_concat(pimg.id) as modifier_group_ids  
from items as pii
left join category_item as pici on pii.id = pici.item_id
left join categories as pic on pici.category_id = pic.id
left join item_modifier_group as piimg on pii.id = piimg.item_id
left join modifier_groups as pimg on piimg.modifier_group_id = pimg.id
where pii.account_id = 728
group by pii.id;

结果是这样,第 4 列(category_ids)正在与重复值分组..

id     |name                        |sku |category_ids            |modifier_group_ids |
-------|----------------------------|----|------------------------|-------------------|
336937 |Chicken Pullets             |    |12981                   |                   |
336938 |Hats                        |    |12965                   |                   |
336939 |Jack Fruit Taco Salad       |    |12975,12975,12975       |57,58,60           |
336940 |Vegatarian Taco Salad       |    |12975,12975,12975       |58,60,57           |
336941 |Pulled Pork Taco Salad      |    |12975,12975,12975       |58,57,60           |
336942 |Ground Beef Taco Salad      |    |12975,12975,12975       |60,57,58           |
336943 |Steak Taco Salad            |    |12975,12975,12975       |57,58,60           |
336944 |Chicken Taco Salad          |    |12975,12975,12975       |60,58,57           |
336945 |Jack Fruit Quesadilla       |    |12976,12976,12976,12976 |58,60,57,56        |

【问题讨论】:

好像你在某个地方需要 DISTINCT... 【参考方案1】:

您的查询看起来不错,而且大部分重复数据都与JOIN 一起出现。尝试在group_concat() 中使用distinct,如下所示。

group_concat(distinct pic.id) category_ids,

【讨论】:

感谢您的帮助。【参考方案2】:

如果您不想通过group_concat() 连接重复值,则只需在函数中使用distinct 关键字:

select pii.id, pii.name, pii.sku, group_concat(DISTINCT pic.id) category_ids, group_concat(pimg.id) as modifier_group_ids  
from items as pii
left join category_item as pici on pii.id = pici.item_id
left join categories as pic on pici.category_id = pic.id
left join item_modifier_group as piimg on pii.id = piimg.item_id
left join modifier_groups as pimg on piimg.modifier_group_id = pimg.id
where pii.account_id = 728
group by pii.id;

【讨论】:

谢谢,这解决了问题。我选择了另一个答案,因为它是在你之前发布的。

以上是关于带有大量左连接的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Linq 中使用左外连接

SQL查询中左连接之后的所有连接是不是也必须是左连接?为啥或者为啥不?

如何将在左连接中具有连接的 sql 转换为查询构建器?

将 SQL 转换为带有 null 的 Linq 左连接

SQL 查询左连接问题

sql面试题_sql_分组查询左连接和右连接的区别