我基本上有一个类似的查询:
SELECT * FROM news
LEFT JOIN tags ON tags.newsid = news.id
现在让我们说,我希望获得所有news
行(tags
表中的行)tags.name
值为“test”,另一个标记为{{ 1}}值是“test2”。
基本上,我想在连接表中检查两个值,如果它们都在那里,那么返回tags.name
行。
这怎么可能?很抱歉,如果之前有人询问,我真的不知道在搜索这个特定问题时我会使用哪种关键字,因为它非常复杂。
答案 0 :(得分:5)
SELECT news.*, COUNT(*) c
FROM news
INNER JOIN tags ON tags.newsid = news.id
WHERE tags.name IN ("test", "test2")
HAVING c = 2
我假设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
另一种方法是:
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")
后一种方法更容易推断为任意组合。
答案 1 :(得分:0)
试试这个:
select * from news where
(select count(*) from tags where tags.newsId = news.id and tags.name='test')=1 and
(select count(*) from tags where tags.newsId = news.id and tags.name='test2')=1
答案 2 :(得分:0)
使用子查询来标识标记表中的相关行应该可以为您提供所需的结果。
SELECT * FROM news n
INNER JOIN (SELECT newsid FROM tags WHERE tags.name in ('test1', 'test2')) t
ON n.id = t.newsid