2013-08-29 36 views
-3

需要有关选择查询的帮助。我有一个存储发票项目的数据库。所以发票可以有多个项目。选择具有以下值的行

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
+1

请更新您的问题与您目前有查询,为什么它不工作。 – Kermit

回答

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子句fi你可以使用你需要的product_id返回那些(1,2,3),但是然后添加一个HAVING子句,你将添加另一个过滤器来返回那些产品id大于3的不同计数的行。

如果你接着要回来的是你可以使用下面的查询的详细信息以获得结果:

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

+0

谢谢你们!得到它了! – user2730681

0

使用子查询,选择包含你感兴趣的产品发票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)