您有以下数据库架构:
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
我该怎么做?
答案 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;