代码之家  ›  专栏  ›  技术社区  ›  Michael

如果子表没有给定父ID的记录,则选择

  •  0
  • Michael  · 技术社区  · 8 年前

    我有桌子 contracts , party 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;
    

    工作正常,但如果表中没有记录 剂量 party_id 等于 party.id 然后这些记录就不显示了。

    上面的查询给了我75个结果。更不用说了 剂量 ,共有103行:

    select contract_number, comp, ml, party.room 
      from party 
      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;
    

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

    1 回复  |  直到 8 年前
        1
  •  3
  •   AntG    8 年前

    使用A 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