连接表的地方

时间:2013-11-04 16:19:45

标签: mysql join

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

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

现在让我们说,我希望获得所有news行(tags表中的行)tags.name值为“test”,另一个标记为{{ 1}}值是“test2”。 基本上,我想在连接表中检查两个值,如果它们都在那里,那么返回tags.name行。

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

3 个答案:

答案 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