从一个表中选择记录

时间:2012-03-14 08:57:59

标签: mysql

我有下表(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.

有什么想法吗?

4 个答案:

答案 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)