我有下表(tbl_product_rel):
id product_id attr_id
1 1 10
2 1 15
3 1 20
4 2 6
5 2 9
6 3 10
7 3 15
8 3 20
9 4 15
我希望得到的at__id恰好等于10,15,20的product_ids。如果我使用MySQL IN
SELECT DISTINCT(product_id)FROM
tbl_product_rel
WHERE attr_id IN (10,15,20)
所以我也得到了attr_id等于15的product_id,但它没有attr_ids 10和20.
有什么想法吗?
答案 0 :(得分:4)
您可以使用这样的查询,但我不知道这是否是最佳解决方案:)
SELECT * FROM tbl_product_rel WHERE attr_id IN (10,15,20) GROUP BY product_id HAVING COUNT(product_id) = 3
答案 1 :(得分:2)
您可能会认为查询不起作用的原因可能是由于DISTINCT
功能造成的
想想你想要的产量是多少?你想得到attr_id为10,15或20的所有product_id。这意味着你需要以下id:
id product_id attr_id
1 1 OK 10
2 1 OK 15
3 1 OK 20
4 2 NO 6
5 2 NO 9
6 3 OK 10
7 3 OK 15
8 3 OK 20
9 4 OK 15
所以没有distinct的基本查询应该返回:
1, 1, 1, 3, 3, 3, 4
如果您使用distinct,您将获得唯一的ID:
1, 3, 4
我相信这就是你得到的。
您可能需要“id”而不是“product_id”。
更新:
啊,我现在可能是你的问题。您期望得到满足所有3个条件的product_id。您无法使用IN
,因为IN
会将ID与OR
相关联。您编写的查询可以重写为:
`SELECT DISTINCT(product_id) FROM tbl_product_rel WHERE attr_id = 10 OR attr_id = 15 OR attr_id = 20`.
如果您确定没有重复项(即attr_id = 20的2条记录),您的解决方案将是
`SELECT product_id FROM tbl_product_rel WHERE attr_id IN (10, 15, 20) GROUP BY product_id HAVING count(*) = 3
但如果您允许重复项,则无法执行此操作,例如在此方案中:
id product_id attr_id
1 1 10
2 1 20
3 1 20
你会得到1但你不应该(根据你的需要)。如果您允许这样的情况,请告诉我。
答案 2 :(得分:1)
听起来你只想要带有所有三个属性id的product_ids。你可以用一些丑陋的子查询来做到这一点:
SELECT DISTINCT(product_id) FROM tbl_product_rel
WHERE product_id IN
(SELECT product_id FROM tbl_product_rel WHERE attr_id=10)
AND product_id IN
(SELECT product_id FROM tbl_product_rel WHERE attr_id=15)
AND product_id IN
(SELECT product_id FROM tbl_product_rel WHERE attr_id=20)
你也可以做一些丑陋的加入。
答案 3 :(得分:0)
删除不同的功能:
SELECT product_id FROM tbl_product_rel WHERE attr_id IN (10,15,20)