查找满足两个条件且唯一的行
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
的所有行与这些 URLid
s.
您好,我有以下 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
的所有行与这些 URLid
s.