-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 行,因为 invoice# 123 有产品 1,2,3 而不管它可能有什么其他产品

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

2 回答 2

4

如果您想返回所有invoice_ids具有产品 1、2 和 3 的产品,那么您将需要查看使用类似于以下内容的 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 子句,您将添加另一个过滤器以返回产品 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

于 2013-08-29T20:15:36.127 回答
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)
于 2013-08-29T20:23:12.570 回答