0

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

SELECT * FROM news
LEFT JOIN tags ON tags.newsid = news.id

现在假设,我想获取所有news具有标签(tags表中的行)的行,其tags.name值为“test”,另一个标签的tags.name值为“test2”。所以基本上,我想检查连接表中的两个值,如果它们都在那里,然后返回该news行。

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

4

3 回答 3

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")

后一种方法更容易外推到任意组合。

于 2013-11-04T16:24:19.343 回答
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
于 2013-11-04T16:25:40.767 回答
0

使用子查询来识别标签表中的相关行应该会给你你正在寻找的结果。

SELECT * FROM news n
INNER JOIN (SELECT newsid FROM tags WHERE tags.name in ('test1', 'test2')) t
ON n.id = t.newsid
于 2013-11-04T16:31:08.467 回答