假设我有一个存储产品及其类别之间关系的表:
p_id | c_id
-----+-----
1 | 1
1 | 2
2 | 1
2 | 2
2 | 3
3 | 2
如您所见,一个产品可能有多个类别。如何搜索分配了类别 1 和 2 的商品?我能想到的最接近的是使用 JOIN:
SELECT a.p_id
FROM rel_table a
JOIN rel table b
ON a.p_id=b.p_id AND b.c_id=2
WHERE a.c_id=1
虽然这实现了我想要的,但它不切实际,因为我的查询将是动态的。如果我必须选择具有 3 个类别的产品,这需要在查询中进行困难的更改。
有没有更清洁、更聪明的方法来实现这一目标?我想象一些东西,选择第一个集合,然后用另一个类别细化所需的级别数量。
你应该使用 IN 或 Between 来处理这些事情。您可以动态创建放入IN/BETWEEN
中的值
SELECT a.p_id
FROM rel_table a
WHERE a.c_id IN (1,2,3)
group by a.p_id
having count(1) = 3
order by a.p_id asc
或
SELECT a.p_id
FROM rel_table a
WHERE a.c_id between 1 and 3
group by a.p_id
having count(1) = 3
order by a.p_id asc