MySQL - 根据子记录中冲突的WHERE子句返回父记录

时间:2014-09-03 14:14:26

标签: mysql sql

我是一个包含以下表格的数据库:

订单,行,供应商

行表格中有订单和行表格的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

有没有一种简单的方法可以做到这一点(最好没有子查询,因为我在这里已经是一个更大的查询的一部分了?)

任何建议表示赞赏。

由于

2 个答案:

答案 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比较的布尔结果,并自动将它们转换为整数10。使用这个&#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)

上的索引