您好我有以下表格:
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(即并非所有行都满足它们必须关联两个关键字)
有什么想法吗?
答案 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
运算符会使用这些值来选择URL
个URLid
的所有行。