如果这是重复的,我深表歉意,我试图搜索答案,但可能没有正确的关键字来帮助我的搜索。
小提琴:http ://sqlfiddle.com/#!9/ea5723/6
我有3张桌子:
地方
+----+---------+
| id | name |
+----+---------+
| 1 | Place A |
| 2 | Place B |
| 3 | Place C |
| 4 | Place D |
| 5 | Place E |
+----+---------+
标签
+----+-------+
| id | slug |
+----+-------+
| 1 | tag-z |
| 2 | tag-y |
| 3 | tag-x |
| 4 | tag-w |
| 5 | tag-v |
+----+-------+
place_taxonomy
+----------+--------+
| place_id | tag_id |
+----------+--------+
| 1 | 1 |
| 1 | 3 |
| 1 | 5 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
| 3 | 5 |
| 4 | 2 |
| 4 | 4 |
+----------+--------+
我已经能够查询哪些地方有一个标签
SELECT
places.id AS p_id,
places.name
FROM
places
LEFT JOIN place_taxonomy
ON places.id=place_taxonomy.place_id
LEFT JOIN tags
ON place_taxonomy.tag_id=tags.id
WHERE
tags.id=1
GROUP BY
p_id;
我可以选择哪些地方有多个标签:
SELECT
places.id AS p_id,
places.name
FROM
places
LEFT JOIN place_taxonomy
ON places.id=place_taxonomy.place_id
LEFT JOIN tags
ON place_taxonomy.tag_id=tags.id
WHERE
tags.id=1 OR
tags.id=2
GROUP BY
p_id;
但是,我遇到的麻烦是如何选择具有标签组合的地方,例如 tag-z 和 tag-y
SELECT
places.id AS p_id,
places.name
FROM
places
LEFT JOIN place_taxonomy
ON places.id=place_taxonomy.place_id
LEFT JOIN tags
ON place_taxonomy.tag_id=tags.id
WHERE
tags.id=1 AND
tags.id=2
GROUP BY
p_id;
#Returns No Results!
您的查询很接近。您可以使用 GROUP BY 和 SUM 来查找这些关系。
请注意,我的查询在启用 sql-mode only_full_group_by 时有效,因为 places.id 是 PRIMARY 键。
询问
结果
演示http://sqlfiddle.com/#!9/ea5723/15
或者使用交付的表格查找带有标签“tag-z”和“tag-y”的地方。
询问
结果
演示http://sqlfiddle.com/#!9/ea5723/27
小提琴:http ://sqlfiddle.com/#!9/ea5723/9
这是我的合理解决方案,但我认为那里可能有更好的答案。在这个答案中,我为每个需要比较的标签添加了多个连接。因此,如果我正在寻找 5 个共同的标签,则查询将有 10 个连接语句。
上面的查询将给出 Plan C 的响应,它同时具有标签
tag-z
和tag-y
更新:或者,如果按 id 而不是任何其他列选择标签,那么我们可以删除标签加入。至少那时我们对于每个关系检查只有一个额外的连接。