Mysql GROUP命令

时间:2011-10-04 11:30:54

标签: mysql group-by

我有一个查询提取报告取决于审核日期,但我很困惑GROUP命令如何处理我对输出的期望。

这是我的疑问,

SELECT prd.fldemployeeno `EmployeeNo`,
       prd.fldorderid `OrderNo`,
       prd.fldstarttime `TimeProcessed`,
       COUNT(qua.seqid) `ErrorCount`,
       COALESCE(qua.fldstarttime,(SELECT fldstarttime FROM tblproductionitl p
                                   WHERE (p.fldglobalid = prd.fldglobalid)
                                     AND p.fldprojectgroup=prd.fldprojectgroup
                                     AND p.fldstarttime > prd.fldstarttime
                                     AND prd.fldemployeeno != p.fldemployeeno
                                   LIMIT 0,1)) AS `AuditDate`
  FROM tblproductionitl prd
 INNER JOIN tblisauditeditl aud
    ON prd.fldglobalid=aud.fldid
  LEFT JOIN tblqualityaudit qua
    ON prd.fldglobalid=qua.fldid
   AND prd.fldstarttime=qua.fldprodstarttime
 GROUP BY prd.fldemployeeno,prd.fldorderid
 HAVING `AuditDate` BETWEEN '2011-10-04 00:00:00' AND '2011-10-04 23:59:59'
 ORDER BY `AuditDate`

这是

的输出
+-------------+---------------+---------------------+------------+---------------------+
| EmployeeNo  |   OrderNo     | TimeProcessed       | ErrorCount |  AuditDate          |
+-------------+---------------+---------------------+------------+---------------------+
| PSAA50577   | 20110930n01   | 2011-10-04 10:41:23 |   3        | 2011-10-04 10:44:07 |   
| PSAA50576   | 20111003n01   | 2011-10-03 11:39:52 |   1        | 2011-10-04 10:58:48 |
| PSAA50515   | 20110930n01   | 2011-10-04 10:44:07 |   1        | 2011-10-04 11:12:03 |
| PSAA50577   | 20111003n02   | 2011-10-03 12:22:33 |   1        | 2011-10-04 16:47:16 |
| PSAA50577   | 20110930n10   | 2011-10-01 18:27:09 |   1        | 2011-10-04 18:29:29 |
+-------------+---------------+---------------------+------------+---------------------+

然后我删除了GROUP命令中的prd.fldorderid,以便报告将仅从EmployeeNo分组。但输出只返回1行而不是3行。请参阅下面的查询和输出。

SELECT prd.fldemployeeno `EmployeeNo`,
       prd.fldorderid `OrderNo`,
       prd.fldstarttime `TimeProcessed`,
       COUNT(qua.seqid) `ErrorCount`,
       COALESCE(qua.fldstarttime,(SELECT fldstarttime FROM tblproductionitl p
                                   WHERE (p.fldglobalid = prd.fldglobalid)
                                     AND p.fldprojectgroup=prd.fldprojectgroup
                                     AND p.fldstarttime > prd.fldstarttime
                                     AND prd.fldemployeeno != p.fldemployeeno
                                   LIMIT 0,1)) AS `AuditDate`
  FROM tblproductionitl prd
 INNER JOIN tblisauditeditl aud
    ON prd.fldglobalid=aud.fldid
  LEFT JOIN tblqualityaudit qua
    ON prd.fldglobalid=qua.fldid
   AND prd.fldstarttime=qua.fldprodstarttime
 GROUP BY prd.fldemployeeno
 HAVING `AuditDate` BETWEEN '2011-10-04 00:00:00' AND '2011-10-04 23:59:59'
 ORDER BY `AuditDate`

此查询的输出为:

+------------+--------------+---------------------+--------------+---------------------+
| EmployeeNo |  OrderNo     | TimeProcessed       | ErrorCount   |  AuditDate          |
+------------+--------------+---------------------+--------------+---------------------+
| PSAA50576  |  20111003n01 | 2011-10-03 11:39:52 | 1            | 2011-10-04 10:58:48 |
+------------+--------------+---------------------+--------------+---------------------+

任何人都可以帮我分析一下如何在第二个查询中返回1行,以及如何从Employee no中对输出库进行分组。

2 个答案:

答案 0 :(得分:2)

您应该从MySQL doc

检查您的分组方式
  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。   此外,不能从每个组中选择值   受添加ORDER BY子句的影响。对结果集进行排序   选择值后发生,ORDER BY不影响   服务器选择哪个值

编辑解释。给出这个例子:

  SELECT column1
       , column2
GROUP BY column1

如果表格可以有column2给定column1的一个值,这是不安全的,因为无论何时执行查询,您都可以获得不同的column2值。 在您的子查询中,您正在执行此操作,您应该重写查询以避免它。

答案 1 :(得分:0)

通过折叠给定列中具有相同值的所有行进行分组。

请注意,ErrorCount对于您的单行为1 这通常意味着确实只有一行符合该查询的标准 换句话说,有和没有group by的输出相同。

尝试将ErrorCount的定义更改为count(*) as ErrorCount 如果errorcount仍为1.您的基础数据已更改,因此只选择了一行。