我使用这些模型表简化了多对多关系案例。
Posts:
------------------------------
| id | title | body |
------------------------------
| 1 | One | text1 |
| 2 | Two | text2 |
| 3 | Three | text3 |
------------------------------
Tags:
-------------------
| id | name |
-------------------
| 1 | SQL |
| 2 | GLSL |
| 3 | PHP |
-------------------
Post_tags:
------------------------------
| id | p_id | t_id |
------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 1 |
| 3 | 3 | 2 |
------------------------------
我的目标是查询带有特定标签的帖子,我对此没有问题,但我也想显示帖子的所有相关标签,而不仅仅是我查询的标签。我的查询如下所示:
SELECT p.Title, p.Body, t.name
FROM Posts p
LEFT JOIN Post_tags pt ON p.id = pt.p_id
LEFT JOIN Tags t ON t.id = pt.t_id
WHERE t.name LIKE '%SQL%'
这将获取带有“SQL”标签的帖子,但它仅将带有标签的帖子表与找到“SQL”字符串的标签连接起来,因此与帖子关联的另一个标签“PHP”不会被连接起来。
显然问题是我在 WHERE 子句中加入表,但是如何在一个查询或(最好是子查询)中解决这个问题?
目前,我在我的应用程序中的两个单独的查询中执行此操作,一个用于选择匹配的帖子,另一个用于检索完整的帖子数据。这不是那么有效,而且似乎也是一个蹩脚的解决方案,而且我还没有找到更好的解决方案,所以我决定询问 StackOverflow 社区。