Получение строк, которые содержат key1 и не содержат key2 - PullRequest
1 голос
/ 03 декабря 2011

У меня есть 3 таблицы, которые выглядят так:

  • Таблица 1 (основная таблица):

    item_id (item_id, item_name) // item_id set to primary 
    row1    (1,       "item 1")
    row2    (2,       "item 2")
    row3    (3,       "item 3")
    
  • Таблица 2 (связываниетаблица):

    item_keywords (ikid, #item_id, #keyword_id) // ikid is set to primary 
    row1          (1,       1,     1)
    row2          (2,       1,     2)
    row3          (3,       1,     3)
    row4          (4,       2,     1)
    row5          (5,       3,     1) 
    
  • Таблица 3:

    keywords (keyword_id, keyword_name) // keyword_id is set to primary 
    row1          (1,       "key1")
    row2          (2,       "key2")
    row3          (3,       "key3")
    row4          (4,       "key4")
    row5          (5,       "key5") 
    

Я хотел бы сделать запрос, который возвращает все элементы, которые содержат определенныеключевые слова И также не содержат некоторые другие ключевые слова.

Если вы посмотрите на данные таблицы выше, вы увидите, что:

Item 1 contains keywords with ids: 1,2 and 3; 
Item 2 contains keyword with id: 1 
item 3 contains keyword_id =1 

Так что мне нужен запрос, который вернет все элементы, которыесодержат key1 (keyword_id = 1) и НЕ содержат key3 (keyword_id = 3).В этом примере запрос должен вернуть key2 (keyword_id = 2), key3 (keyword_id = 3).

Примерно так:

SELECT a.*
FROM items a
JOIN item_keywords b ON b.item_id = a.item_id
WHERE b.keyword_id = 1
   AND b.keyword_id != 3

Но это не работает должным образом, потому что запрос возвращает key1, key2 и key3.Ответ должен быть: key2 и key3.Какой самый простой способ сделать это?

1 Ответ

3 голосов
/ 03 декабря 2011
SELECT i.*
FROM items AS i
INNER JOIN item_keywords AS ik ON i.item_id = ik.item_id
WHERE keyword_id = 1
   AND ik.item_id NOT IN
   (
      SELECT item_id
      FROM item_keywords
      WHERE keyword_id = 3
   )

Пример работы запроса:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...