查找满足两个条件且唯一的行

时间:2015-06-18 10:17:56

标签: mysql union

您好我有以下表格:

Keyword
--------------------
| id   | Value     |
--------------------
| 1    | test1     |
| 2    | test2     |
|------------------|

URL
---------------------------
| id   | URL               |
---------------------------|
| 1    | www.something.com |
|--------------------------|

Keywords_URL
---------------------------
| Keywordid   | URLid     |
---------------------------
| 1           | 1         |
| 2           | 1         |
|-------------------------|

所以我的想法是,我有很多与关键字相关联的网址,一个网址可以包含多个关键字,而且很多网址都可以包含相同的关键字。

因此,URL表描述了有关特定URL的信息,关键字表描述了关键字的信息,其他Keywords_URL表链接了这两个表。

我正在寻找一个查询,以便返回所有具有两个关键字条件的网址。

例如,我想知道,包含“test1”“test2”关键字的网址。因此,结果应该是包含与之关联的两个关键字的所有网址。

此外,我希望我的结果为“Distinct”,因此没有重复的行。

我很惊讶MySQL不支持INTERSECT条款,现在我正在寻找解决方法。

这是我到目前为止所做的:

(SELECT kewyord.Value, URL.id id, FROM Keywords_URL JOIN Keyword ON Keywords_URL.Keywordid = Keyword.id JOIN URL ON Keywords_URL.URLid = URL.id WHERE Keywords.Value = "test1")
UNION DISTINCT
(SELECT kewyord.Value, URL.id id, FROM Keywords_URL JOIN Keyword ON Keywords_URL.Keywordid = Keyword.id JOIN URL ON Keywords_URL.URLid = URL.id WHERE Keywords.Value = "test2")
ORDER BY id;

问题在于我确实获得了重复行,但我也得到了具有两个关键字之一的URL(即并非所有行都满足它们必须关联两个关键字)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT id, URL
FROM URL
WHERE id IN (SELECT ku.URLid 
             FROM Keywords_URL AS ku 
             INNER JOIN Keyword AS k ON ku.Keywordid = k.id
             WHERE k.value IN ('test1', 'test2')
             GROUP BY ku.URLid
             HAVING COUNT(DISTINCT k.id) = 2)

WHERE子句中使用的子查询会选择将两者 URLid作为关联关键字的所有'test1', 'test2'。然后,IN运算符会使用这些值来选择URLURLid的所有行。