获取包含key1且不包含key2的行

时间:2011-12-03 16:50:41

标签: mysql sql

我有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 个答案:

答案 0 :(得分:3)

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
   )

Example of query working: