排除查询结果中的重复行

时间:2011-02-08 09:17:04

标签: mysql sql

我想从两个以上连接的表中计算数据库中的记录数。

例如,我有一张这样的表。

table
jobd  +  name
    1  |  jobA
    2  |  jobB

tableA
imgeid  +  orderid   +    jobid   
      1 |  1         |    1
      2 |  2         |    1
      3 |  3         |    1
      4 |  4         |    1    (this order is not yet started)

tableB
taskid  +  orderid   +    task  +  status
      1 |  1         |    1     |  UPDATED
      2 |  1         |    1     |  UPDATED
      3 |  1         |    1     |  COMPLETED
      4 |  2         |    2     |  SAVED
      5 |  3         |    3     |  COMPLETED

我的问题是,当我根据状态(@ tableB)计算时,我的查询会产生具有相同orderid的UPDATED。

这是我的样本查询,与我正在使用的查询相同。

SELECT t.name
    COUNT(CASE WHEN tb.task = 1 AND tb.status <> 'COMPLETED' THEN tb.status ELSE NULL END) inprogress,
    COUNT(CASE WHEN tb.task = 1 AND tb.status = 'COMPLETED' THEN tb.status ELSE NULL END) completed
FROM tableA ta
LEFT JOIN tableB tb
    ON tb.orderid = ta.orderid
LEFT JOIN table t
    ON t.jobid = ta.jobid
GROUP BY t.jobid;

我的结果类似

name   +    inprogress     +   completed
jobA   |    2              |   1

inprogress结果必须只有1,因为它具有相同的orderid。它有两个UPDATED的原因是因为这个表是历史性的。我不知道如何在tableB中获得不同的orderid,因此它只会得到1。

这里的要点是,我可以计算每个工作正在进行,已完成和未开始的总订单。

我希望我的问题很明确。如果您有其他方式,请告诉我。谢谢

1 个答案:

答案 0 :(得分:0)

你不能使用Count明显吗?这是一个链接,看到更接近页面底部,它只会指定您指定的唯一字段:w3schools.com/sql/sql_func_count.asp

SELECT t.name
COUNT(DISTINCT tb.orderid CASE WHEN tb.task = 1 AND tb.status  'COMPLETED' THEN tb.status
ELSE NULL END) inprogress,
COUNT(DISTINCT tb.orderid CASE WHEN tb.task = 1 AND tb.status = 'COMPLETED' THEN tb.status
ELSE NULL END) completed