作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 MySQL 数据库中有 3 个表:
项目
id | item_name
---+----------
1 | item1
2 | item2
3 | item3
4 | item4
标签
id | tag_name
---+---------
1 | A
2 | B
3 | C
items_tags
id | items_id | tags_id
---+----------+-------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 2 | 1
5 | 2 | 3
6 | 4 | 3
我可以使用此查询获取所有项目和标签:
SELECT items.item_name,
GROUP_CONCAT(tags.tag_name) AS item_tags
FROM items
LEFT JOIN items_tags ON items.id=items_tags.items_id
LEFT JOIN tags ON items_tags.tags_id=tags.id
GROUP BY items.id;
output:
item_name | item_tags
----------+----------
item1 | A, B, C
item2 | A, C
item3 | NULL
item4 | C
Q1:如何获取带有特定标签的所有项目
... where is A tag
output:
item_name | item_tags
----------+----------
item1 | A, B, C
item2 | A, C
Q2:如何获取没有特定标签的所有项目
... where is not B
output:
item_name | item_tags
----------+----------
item2 | A, C
item3 | NULL
item4 | C
第三季度:组合
... where is C and is not B
output:
item_name | item_tags
----------+----------
item2 | A, C
item4 | C
最佳答案
您必须添加一个HAVING
子句。
对于特定标签,例如与“C”:
SELECT items.item_name,
GROUP_CONCAT(tags.tag_name) AS item_tags
FROM items
LEFT JOIN items_tags ON items.id=items_tags.items_id
LEFT JOIN tags ON items_tags.tags_id=tags.id
GROUP BY items.id
HAVING COUNT(CASE WHEN tags.tag_name = 'C' THEN 1 END) > 0
输出:
item_name item_tags
=====================
item1 A,B,C
item2 A,C
item4 C
对于没有,例如不“B”:
SELECT items.item_name,
GROUP_CONCAT(tags.tag_name) AS item_tags
FROM items
LEFT JOIN items_tags ON items.id=items_tags.items_id
LEFT JOIN tags ON items_tags.tags_id=tags.id
GROUP BY items.id
HAVING COUNT(CASE WHEN tags.tag_name = 'B' THEN 1 END) = 0
输出:
item_name item_tags
=====================
item2 A,C
item3 NULL
item4 C
和组合,例如不是 B 和“A”:
SELECT items.item_name,
GROUP_CONCAT(tags.tag_name) AS item_tags
FROM items
LEFT JOIN items_tags ON items.id=items_tags.items_id
LEFT JOIN tags ON items_tags.tags_id=tags.id
GROUP BY items.id
HAVING COUNT(CASE WHEN tags.tag_name = 'B' THEN 1 END) = 0 AND
COUNT(CASE WHEN tags.tag_name = 'A' THEN 1 END) > 0
输出:
item_name item_tags
===================
item2 C,A
关于MySQL 和 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461464/
我是一名优秀的程序员,十分优秀!