我有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。这样做最简单的方法是什么?
答案 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
)