选择具有以下值的行

时间:2013-08-29 20:12:46

标签: mysql

需要有关精选查询的帮助。我有一个存储发票项目的数据库。因此发票可以有多个项目。

id   invoice_id    product_id
1     123            1
2     123            2
3     123            3
4     123            5  
5     124            1      
6     124            2

我需要的是一个返回所有product_id等于1,2,3的发票的查询。 这意味着如果发票123有产品1,2,3和5也返回它,但它必须包含至少1,2,3

所以查询应该只返回前4行,因为发票#123有产品1,2,3,不管它可能有什么产品

id   invoice_id    product_id
1     123            1
2     123            2
3     123            3
4     123            5 

2 个答案:

答案 0 :(得分:4)

如果要返回包含产品1,2和3的所有invoice_ids,那么您需要查看使用类似于以下内容的HAVING子句:

select invoice_id
from yourtable
where product_id in (1, 2, 3)
group by invoice_id
having count(distinct product_id) >= 3

使用WHERE子句过滤器,您可以返回带有您需要的product_id的那些(1,2,3),但随后添加一个HAVING子句,您将添加另一个过滤器,以返回具有大于3的产品ID的独特计数的那些行

如果您想要返回所有细节,可以使用以下查询来获得结果:

select id, invoice_id, product_id
from yourtable
where invoice_id in (select invoice_id
                     from yourtable
                     where product_id in (1, 2, 3)
                     group by invoice_id
                     having count(distinct product_id) >= 3);

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

使用子查询选择包含您感兴趣的产品的发票ID,然后使用此结果选择相同的发票ID以及与这些ID相关联的所有产品:

SELECT id, invoice_id, productid 
FROM invoices 
WHERE invoice_id IN (SELECT invoice_id 
                     FROM invoices 
                     WHERE product_id IN (1, 2, 3) 
                     GROUP BY invoice_id)