2012-03-14 162 views
1

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

我想这有attr_ids正好等于10,15,20 product_ids。如果我使用MySQL在

SELECT DISTINCT(产品)FROM tbl_product_rel WHERE attr_id IN (10,15,20)

,所以我得到同样的product_id已attr_id等于15,但它确实没有attr_ids 10和20.

任何想法?

+0

删除不同的功能... – 2012-03-14 09:01:14

+0

这是正确的查询。发布你的结果请 – mkk 2012-03-14 09:01:55

+2

你不会得到他们,因为他们共享相同的产品ids 1和3 – 2012-03-14 09:06:57

回答

4

您可以使用这样的查询,但我不知道这是不是最好的解决办法:)

SELECT * FROM tbl_product_rel WHERE attr_id IN (10,15,20) GROUP BY product_id HAVING COUNT(product_id) = 3 
0

删除独特的功能:

SELECT product_id FROM tbl_product_rel WHERE attr_id IN (10,15,20)

1

这听起来像你想只有具有全部三个属性ID的产品ID。你可以用一些丑陋的子查询做到这一点:

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) 

你也可以做一些丑陋的连接。

+0

你之间建议的这种“between”之间有什么问题? o_O – rMX 2012-03-14 09:12:17

+0

如果我理解他正在寻找具有属性10和15和20但不是10或15或20的ID。因此,我们需要一个查询来确保它检查每个值。之间将返回任何这些值。也有可能还有其他的价值观,他在10到20之间没有提到。 – Ilion 2012-03-14 09:18:30

2

您可能会因为DISTINCT函数而得到您的查询无效的印象。
想想你想要的输出是什么?你想要得到的所有的product_id其中attr_id是10,15或20。这意味着你需要以下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 

所以如果没有基本的查询不同应该返回:

1, 1, 1, 3, 3, 3, 4 

如果你使用不同的,你将获得独特的ID:

1, 3, 4 

我相信这是你得到的。

有可能你想要“id”而不是“product_id”。

更新:

啊我现在可能是什么问题。您期望获得满足所有3个条件的product_id。您不能使用IN,因为IN会加入ID为OR的ID。您所写的查询可以改写为:

`SELECT DISTINCT(product_id) FROM tbl_product_rel WHERE attr_id = 10 OR attr_id = 15 OR attr_id = 20`. 

如果您确定没有重复项(即,2条记录与attr_id = 20),您的解决方案将是

`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,但你不应该”吨(根据你的需要)。如果你允许这样的场景,请让我知道。

相关问题