我基本上有一个类似的查询:
SELECT * FROM news
LEFT JOIN tags ON tags.newsid = news.id
Run Code Online (Sandbox Code Playgroud)
现在让我们说,我希望得到所有news具有标记(tags表中的行)的行,其tags.name值为"test",另一个标记的tags.name值为"test2".所以基本上,我想检查连接表中的两个值,如果它们都在那里,那么返回该news行.
这怎么可能?很抱歉,如果之前有人询问,我真的不知道在搜索这个特定问题时我会使用哪种关键字,因为它非常复杂.
SELECT news.*, COUNT(*) c
FROM news
INNER JOIN tags ON tags.newsid = news.id
WHERE tags.name IN ("test", "test2")
HAVING c = 2
Run Code Online (Sandbox Code Playgroud)
我假设组合tags.newsid, tags.name是独一无二的.
以下是您在评论中所做的工作.
SELECT news.*, COUNT(*) c
FROM news n
INNER JOIN (
SELECT tags.newsid newsid
FROM tags
WHERE tags.name = "test"
UNION ALL
SELECT DISTINCT tags.newsid
FROM tags
WHERE tags.name IN ("test2", "test3")
) t
ON t.newsid = n.id
HAVING c = 2
Run Code Online (Sandbox Code Playgroud)
另一种方法是:
SELECT DISTINCT news.*
FROM news n
JOIN tags t1 ON n.id = t1.newsid
JOIN tags t2 ON n.id = t2.newsid
WHERE t1.name = "test"
AND t2.name IN ("test2", "test3")
Run Code Online (Sandbox Code Playgroud)
后一种方法更容易推断为任意组合.