我有两个表Products
和Keywords
,由公共ID
加入。
PRODUCTS KEYWORDS
Prod_id Prod_name Prod_id Keyword
-------------------- ------------------
1 Broccoli 1 kw1
2 Caulifower 1 kw2
3 Leek 2 kw1
4 Spinach 2 kw3
5 Zucchini 2 kw4
3 kw1
3 kw2
3 kw4
4 kw2
4 kw3
4 kw4
如何仅选择同时具有' kw1'和' kw2' (可能有其他)分配?在上面的例子中,将是Broccoli和Leek。所需关键字列表可以长于两个。这可能是微不足道的,但我无法找到实现这一目标的方法。
如果我这样做
SELECT
Prod_id
FROM
products p
JOIN
keywords k ON p.prod_id = k.prod_id
WHERE
keyword IN ('kw1', 'kw2')
它选择' kw1'或者' kw2' (正如预期的那样)但我需要' kw1' AND ' kw2'。
答案 0 :(得分:2)
首先,如果您只想要products
,则似乎不需要id
表。然后,您可以通过在查询中添加group by
和having
子句来执行您想要的操作:
SELECT k.Prod_id
FROM keywords k
WHERE k.keyword IN ('kw1' ,'kw2')
GROUP BY k.Prod_id
HAVING COUNT(DISTINCT k.keyword) = 2;
答案 1 :(得分:2)
使用此:
select * from Keywords
where Keyword = 'kw1' and Prod_id in(
select Prod_id from Keywords where Keyword = 'kw2'
)
答案 2 :(得分:1)
如果只有几个关键字,那么您可以通过以下方式进行搜索:
SELECT Prod_id FROM products p
where exists (select 1 from keywords
where p.prod_id = k.prod_id and keyword = 'kw1') and
exists (select 1 from keywords
where p.prod_id = k.prod_id and keyword = 'kw2')
答案 3 :(得分:1)
这应该可以解决问题:
SELECT p.prod_id
FROM products p INNER JOIN keywords k
ON p.prod_id = k.prod_id
WHERE k.keyword IN ('kw1','kw2')
GROUP BY p.prod_id
HAVING COUNT(*) = 2;
另一种选择是使用WHERE EXISTS
,但我觉得有点笨拙,因为在这种情况下需要两个子查询。