选择子表是否没有给定父ID的记录

时间:2018-06-18 15:02:17

标签: mysql

我有表class B(A): def __init__(self, *args, **kwargs): super(B, self).__init__(*args, **kawargs) contractsparty(按从属顺序排列)。我想选择某些合同的当事人的剂量信息。这是我的疑问:

doses

它工作正常,但如果表select contract_number, comp, ml, party.room, min(doses.begintime), max(doses.endtime), sum(timestampdiff(second, doses.begintime, doses.endtime))/3600. from doses join party on party.id=doses.party_id join contracts on contracts.id=party.contract_id where contracts.id in(97,144,145) group by party.id order by contract_number, party.room; doses等于party_id的记录没有,那么这些记录就不会显示。

上面的查询给出了75个结果。如果不提party.id,则有103行:

doses

如何修改我的查询以包含这些省略的结果并将min,max,sum设置为零?

1 个答案:

答案 0 :(得分:3)

使用LEFT OUTER JOIN

select contract_number, comp, ml, party.room, 
  min(doses.begintime), max(doses.endtime), 
  sum(timestampdiff(second, doses.begintime, doses.endtime))/3600. 
  from doses 
    LEFT OUTER JOIN party 
      on party.id=doses.party_id 
    join contracts 
      on contracts.id=party.contract_id 
  where contracts.id in(97,144,145) 
  group by party.id 
  order by contract_number, party.room;

这将根据剂量数据返回最小值,最大值和总和。如果你想在没有匹配的聚会参赛作品时将这些作为零,那么你可以做以下的事情:

CASE party.room WHEN NULL THEN 0 ELSE min(doses.begintime) END

不确定Case的语法,但您可以查看它here