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

Find rows that satisfy two conditions and are unique

您好,我有以下 tables:

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

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

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

所以我的想法是,我有很多 URL 链接到一个关键字,一个 URL 可以有多个关键字,许多 URL 可以有相同的关键字.

所以URLtable描述了关于特定URL的信息,关键字table描述了关于关键字的信息,另一个Keywords_URL table 链接两个 table。

我正在寻找一个查询,这样 return 所有具有两个关键字作为条件的 URL。

例如,我想知道,URLs 同时具有 "test1" "test2" 关键字。因此,结果应该是所有 URL 都具有与之关联的关键字。

此外,我希望我的结果是 "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;

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

有什么想法吗?

您可以使用以下查询:

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子句中使用,selects all URLid having both 'test1', 'test2' as他们的相关关键字。然后 IN 运算符使用这些值来 select URL 的所有行与这些 URLids.