连接表的地方

Den*_*man 0 mysql join

我基本上有一个类似的查询:

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行.

这怎么可能?很抱歉,如果之前有人询问,我真的不知道在搜索这个特定问题时我会使用哪种关键字,因为它非常复杂.

Bar*_*mar 5

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)

后一种方法更容易推断为任意组合.