GROUP_CONCAT 与 LEFT JOIN 条件?

Posted

技术标签:

【中文标题】GROUP_CONCAT 与 LEFT JOIN 条件?【英文标题】:GROUP_CONCAT with LEFT JOIN condition? 【发布时间】:2014-07-30 18:07:47 【问题描述】:

假设我有这些表:

categories

id   name           parent_id
1    Category 1     0     
2    Category 2     1
3    Category 3     1
4    Category 4     2 


products

id   name                 category_id
1    product name 1       2        
2    product name 2       2
3    product name 3       3 
4    product name 4       4


promos

id   product_ids
1    1,2,3
2    1,4
3    2,3
4    4

我想像这样获取所有数据:

product_id   product_name       promo_ids
1            product name 1     1,2
2            product name 2     1,3
3            product name 3     1,3
4            product name 4     2,4

这是我查询数据库的方式:

SELECT GROUP_CONCAT(pr.id) as promo_ids, p.id as product_id, p.name as product_name, 
FROM `products` as p
LEFT JOIN `promos` as pr ON `p`.`id` IN (pr.product_ids)
WHERE p.category_id IN(1,2,3,4)
GROUP BY p.id

但结果并不如我所料。

product_id   product_name       promo_ids
1            product name 1     
2            product name 2     
3            product name 3     
4            product name 4   

我的查询出了什么问题?我想问题是 [promos][product_ids] 字段,但我不知道如何解决这个问题。

提前致谢!

【问题讨论】:

***.com/questions/10956188/… 【参考方案1】:

存储逗号分隔的 id 不是一个好主意,请参阅 Database Normalization,您不能简单地使用 IN() 加入您的集合列,现在您需要使用 FIND_IN_SET 来查找逗号分隔集合中的值

SELECT 
  GROUP_CONCAT(pr.id ORDER BY pr.id) AS promo_ids,
  p.id AS product_id,
  p.name AS product_name 
FROM
  `products` AS p 
  LEFT JOIN `promos` AS pr 
    ON FIND_IN_SET(`p`.`id`,pr.product_ids) 
WHERE p.category_id IN (1, 2, 3, 4) 
GROUP BY p.id 

【讨论】:

非常感谢M Khalid Junaid。再问一个问题。根据文档,如果idproduct_ids 中,则 FIND_IN_SET 返回一个 1 到 N 范围内的值。在 ON 条件下是什么意思? 基本上,当列表中没有找到该值时,该函数返回0mysql会自动将其解析为false,因为ON需要布尔条件。 @NấmLùn 假设这个集合 (1,2,3) 并且我使用 FIND_IN_SET() 将值 1 与这个集合进行比较,所以结果将是 1 集合中匹配值的索引位置,所以对于 2 结果将是 2,对于 4 结果将是 0 @JohnWoo 感谢您的解释!

以上是关于GROUP_CONCAT 与 LEFT JOIN 条件?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:带有LEFT JOIN的GROUP_CONCAT

带有 LEFT JOIN 和 IF 语句的有限 GROUP_CONCAT

GROUP_CONCAT 和 LEFT_JOIN 问题 - 并非所有行都返回

使用 GROUP_CONCAT 进行 LEFT JOIN 的奇怪结果

来自 GROUP_BY 的两个 LEFT JOIN 的 GROUP_CONCAT 的奇怪重复行为

JOIN 和 GROUP_CONCAT 与三个表