我是一个包含以下表格的数据库:
订单,行,供应商
行表格中有订单和行表格的FK:
order_id,supplier_id
我正在尝试编写一个查询,该查询将返回订单记录的计数,这些记录至少有一行来自某个供应商,但没有来自任何其他供应商的行。
因此,只有一行,但该行来自给定供应商的订单将被计算在内。
另一方面,来自给定供应商的100行但只有来自任何其他供应商的订单将不计算在内。
我可以很容易地计算至少一条生产线的订单,但我不得不排除其他供应商的生产线。
SELECT
COUNT(DISTINCT(orders.id)) AS count
FROM orders
INNER JOIN lines
ON lines.order_id = orders.id
WHERE
lines.supplier_id = 1
有没有一种简单的方法可以做到这一点(最好没有子查询,因为我在这里已经是一个更大的查询的一部分了?)
任何建议表示赞赏。
由于
答案 0 :(得分:2)
SELECT orders.id, SUM(lines.supplier_id = 1) AS wanted,
SUM(lines.supplier_id <> 1) AS unwanted
FROM orders
INNER JOIN lines lines.order_id = orders.id
GROUP BY orders.id
HAVING unwanted = 0 AND wanted > 0
基本上:获取所有订单并使用方便的mysql hack,其中上述SUM采用供应商ID比较的布尔结果,并自动将它们转换为整数1
和0
。使用这个&#34;计数&#34;找出哪些订单包含您想要的供应商,以及&#34;总和&#34; 0对于任何其他供应商。
答案 1 :(得分:0)
select count(*) from orders o
where exists (
select 1 from lines l
where l.order_id = o.id
and l.supplier_id = 1
) and not exists (
select 1 from lines l
where l.order_id = o.id
and l.supplier_id <> 1
)
此查询可以利用lines(order_id,supplier_id)