我有两个表:Order(父级)和Expedient(子级)
假设这种情况:
Order
id |
order1 |
Expedient
id | order_id | status
1 | order1 | validated
2 | order1 | validated
3 | order1 | validated
4 | order1 | pending
我需要一个返回Order的查询,但仅在4个子记录处于“已验证”状态时才返回
如果至少有一条记录处于待处理状态,则不应返回任何订单
我尝试使用子查询“ NOT IN”(排除所有待处理的方法),但由于总是向我返回订单,所以它不起作用
答案 0 :(得分:0)
您可以尝试使用count(status)> = 4
select o.order_id
from `Order` o
INNER JOIN Expedient e ON o.order_id = e.order_id
WHERE e.status = 'validated'
GROUP BY o.order_id
having count(e.status) >= 4
请谨慎使用序号作为表名,您需要支持..,最好使用另一个名称。
如果您还需要pendind = 0,那么hading子句就是
having count(e.status) >= 4 AND sum(status ='pending' ) =0
答案 1 :(得分:0)
如果您只需要订单ID,则无需加入:
select order_id
from Expedient
group by order_id
having sum(status = 'pending') = 0
我假设'validated'
列中只有值'pending'
和status
。
如果您要在'validated'
中恰好有4行的值为status
:
select order_id
from Expedient
group by order_id
having sum(status = 'pending') = 0 and sum(status = 'validated') = 4
答案 2 :(得分:0)
如果至少一条记录处于待处理状态,则无顺序 应该退货
NOT EXISTS
子查询就是这种情况:
select o.*
from `Order` o
where not exists (
select *
from Expedient e
where e.order_id = o.id
and e.status = 'pending'
)
等效的方法是“反联接”:
select o.*
from `Order` o
left join Expedient e
on e.order_id = o.id
and e.status = 'pending'
where e.order_id is null
对于两个查询,您都应在Expedient(order_id, status [, other columns])
或Expedient(status, order_id, [, other columns])
上使用andex。
一个NOT IN
查询也可能起作用:
select o.*
from `Order` o
where o.id not in (
select e.order_id
from Expedient e
where e.status = 'pending'
)
但是请注意,如果Expedient.order_id
可以为NULL
,则它可能不返回任何内容。对于此查询,您应该在Expedient(status [, other columns])
上有一个索引-理想情况下是Expedient(status , order_id, [, other columns])
。