如果其他表中不存在 id,则获取不同的行并使用合并

Posted

技术标签:

【中文标题】如果其他表中不存在 id,则获取不同的行并使用合并【英文标题】:get distinct row and use coalesce if id not exist in other table 【发布时间】:2015-08-06 11:49:44 【问题描述】:

我有两张桌子:

Job_Order

-id
-creation_date
-assigned_to
-job_ordertype
-client

Job_Order_Stage

-id
-stage
-date 
-job_order(foreign key to job_order)

如果 Job_Order_Stage 中不存在 id,我想获取 job_order 中的所有行并将 stage 设置为 0。如果在job_order_stage 中找到相同的job_order,我也想只获得max(stage) 的行。我要怎么做?

我这里有查询:

SELECT 
    a.id,a.creation_date,
    e.user_name,c.operation,
    c.system_,d.name,
    Coalesce((s.stage), 0) as stage_name
FROM job_order a
INNER JOIN account b ON a.assigned_to=b.id
INNER JOIN job_order_type c ON a.job_order_type=c.id
INNER JOIN user e ON b.user=e.user_id
INNER JOIN client d ON a.client=d.id
LEFT JOIN job_order_stage s ON s.job_order = a.id

我对这个 sql 语句的问题是,它显示了所有工作订单及其具有不同阶段的副本。如何解决这个问题?

【问题讨论】:

【参考方案1】:

这个会得到你所有不在job_order_stage中的job_orders

select job_order.*
  from job_order
    left join job_order_stage
      on job_order.id = job_order_stage.job_order
  where job_order_stage.job_order is null;

这个得到你的max(stage),工作在job_order_stage中

select job_order.id, max(job_order_stage.stage)
  from job_order 
    inner join job_order_stage
      on job_order.id = job_order_stage.job_order
  group by job_order.id;

或者您是否希望以某种方式将它们结合起来?应该是这样的:

select job_order.*, max(coalesce(job_order_stage.stage, 0)) stage
  from job_order
    left join job_order_stage
      on job_order.id = job_order_stage.job_order
  group by job_order.id

这利用/滥用了mysqls对group by的特殊处理,但在这种情况下应该没问题。

从 cmets 更新

select *
  from (
    select job_order.*, max(coalesce(job_order_stage.stage, 0)) stage
      from job_order
        left join job_order_stage
          on job_order.id = job_order_stage.job_order
      group by job_order.id
 ) q 
 where stage = 2;

【讨论】:

如果可能的话,我希望将它们结合起来。有可能吗? @d_unknown 没问题。如果它为您提供了您想要的值,请随时单击接受答案勾选标记:) 如果我只想获取 max(job_order_stage.stage)==2 的行怎么办 将此查询用作另一个查询的输入/来源。 IE。用where stage = 2 围绕这个选择另一个选择 我是这样设计的:SELECT a.id,a.creation_date,e.user_name,c.system_,d.name, Coalesce(max(s.stage), 0) as stage_name FROM job_order a INNER JOIN account b ON a.assigned_to=b.id INNER JOIN job_order_type c ON a.job_order_type=c.id INNER JOIN user e ON b.user=e.user_id INNER JOIN client d ON a.client=d.id LEFT JOIN job_order_stage s ON s.job_order = a.id WHERE a.assigned_to='$id' and s.stage=(select max(stage) from job_order_stage where job_order=a.id and stage=1) group by a.id

以上是关于如果其他表中不存在 id,则获取不同的行并使用合并的主要内容,如果未能解决你的问题,请参考以下文章

如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续

从一个表中选择行并插入到另一个表中

表中不存在的行

房间更新(如果不存在则插入)行并返回计数更改的行

如何不选择其他表中不存在的行

如何将一个表中的行合并到另一个表中的另一行