根据子表中的条件从父表中选择记录

时间:2019-11-07 17:21:32

标签: mysql sql

我有两个表: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”(排除所有待处理的方法),但由于总是向我返回订单,所以它不起作用

3 个答案:

答案 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])