标题不好,希望这个例子能澄清这一点。
我有个活动。事件有标签。
(简化)我这样显示事件:
SELECT
*.event,
GROUP_CONCAT(tag.name)
FROM event
JOIN tag
ON event.tag_id = tag.id
GROUP BY event.id
假设我想过滤它,只获取那些有标签的事件。id = 2
但仍然显示整个事件,所有的标签。
SELECT
*.event,
GROUP_CONCAT(tag.name)
FROM event
JOIN tag
ON event.tag_id = tag.id
WHERE tag.id = 2
GROUP BY event.id
这将不起作用,因为它将正确显示事件细节,但只显示它所在的标记2
我很确定我错过了一些非常简单的东西,它是什么?: -)
我知道的解决方案:
- 在加载事件详细信息后,稍后获取标签。
- 使用内部查询代替
GROUP_CONCAT(tag.name)
获取当前事件标签
在我看来都"不干净"。
SELECT
event.*,
GROUP_CONCAT(tag.name)
FROM event
JOIN tag
ON event.tag_id = tag.id
JOIN event AS event2
ON event2.id = event.id
AND event2.tag_id = 2
GROUP BY event.id
或:
SELECT
event.*,
GROUP_CONCAT(tag.name)
FROM event
JOIN tag
ON event.tag_id = tag.id
WHERE EXISTS
( SELECT *
FROM event AS event2
WHERE event2.id = event.id
AND event2.tag_id = 2
)
GROUP BY event.id