2015-06-18 4 views
0

Привет У меня есть следующие таблицы:Найти строки, которые удовлетворяют два условий и являются уникальными

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

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

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

Так что идея состоит в том, что у меня есть много URL-адресов, связанных с ключевым словом, URL-адрес может иметь более 1 ключевые слова, и многие URL могут иметь одинаковые ключевые слова.

Таким образом, таблица URL-адресов описывает информацию об определенном URL-адресе, в таблице ключевых слов описывается информация о ключевых словах, а другая таблица Keywords_URL связывает две таблицы.

Я ищу запрос, который вернет все URL-адреса, имеющие в качестве условий два ключевых слова.

Например, я хотел бы знать, что URL-адреса имеют как «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; 

Проблема заключается в том, что я получаю дубликаты строк, но и я получаю URL, которые имеют один из двух ключевых слов (т.е. не все строки удовлетворяют что у них должны быть оба ключевых слова)

Любые идеи?

ответ

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 с.

+0

Эй, спасибо, позвольте мне запустить это, и я вернусь к вам. – John

+0

Это потрясающе, и он отлично работает! Спасибо огромное ! The = 2 в конце запроса используется для определения того, что я ищу 2 ключевых слова или ограничит результаты только 2? – John

+0

'WHERE k.value IN ('test1', 'test2')' * гарантирует *, что все возвращенные URL-адреса связаны либо с ''test1'','' test2'', либо с обоими. '= 2' отфильтровывает те, которые связаны с * только одним * из двух ключевых слов. –