MySQL - 无法使用GROUP_CONCAT并过滤结果

时间:2016-09-07 17:38:40

标签: mysql join

您有以下数据库架构:

items
- id
- item_name

items_cats
- item_id
- cat_id

categories
- id
- cat_name

从现在开始,我可以在单个查询中选择项目和类别:

SELECT i.id, i.item_name, GROUP_CONCAT(c.cat_name) as cats
FROM items AS i, items_cats AS ic, categories AS c
WHERE ic.item_id = i.id AND ic.cat_id = c.id
GROUP BY i.id

这个结果是这样的:

id| item_name | cats
1 | Item 1    | Cat 1, Cat 2
2 | Item 2    | Cat 1
3 | Item 3    | Cat 3, Cat 5
4 | Item 4    | Cat 2, Cat 3, Cat 4

现在我需要相同的结果,但我只想要包含" Cat 3"的记录。如果我添加" c.id = 3"在WHERE子句中,结果如下:

id| item_name | cats
3 | Item 3    | Cat 3
4 | Item 4    | Cat 3

但是我想要项目中的其他类别,例如:

id| item_name | cats
3 | Item 3    | Cat 3, Cat 5
4 | Item 4    | Cat 2, Cat 3, Cat 4

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。刚刚在查询结尾添加了以下内容:

HAVING cats LIKE CONCAT('%', (SELECT cat_name FROM categories WHERE id = 3), '%')

答案 1 :(得分:0)

首先,学会使用正确的JOIN语法。简单的规则:从不FROM子句中使用逗号; 始终使用JOIN子句中的连接条件使用正确的显式ON语法。

其次,您可以使用HAVING子句中的简单谓词来执行此操作:

SELECT i.id, i.item_name, GROUP_CONCAT(c.cat_name SEPARATOR ', ') as cats
FROM items i JOIN
     items_cats ic 
     ON  ic.item_id = i.id JOIN
     categories c
     ON ic.cat_id = c.id
GROUP BY i.id
HAVING MAX(c.cat_name = 'Cat 3') > 0;

您的分隔符中似乎有空格。

如果您想通过id执行此操作,请使用:

HAVING MAX(c.id = 3) > 0;