2011-10-10 58 views
2

我有一个查询组合COALESCE语法。 COALESCE语法只需找到文件的审核日期。在我的WHERE语句中,我只想从AuditDate别名字段输出Audited File base,但我不工作。这是我的查询。COALESCE语法上的MySQL条件

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
     prd.employeeno AS `EmployeeNo`, 
     prd.starttime AS `StartTime`, 
     prd.endtime AS `EndTime` 
    FROM production prd 
    LEFT JOIN qualityaudit qua 
    ON prd.id=qua.id 
WHERE `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 

任何人都可以帮助我如何得到这个查询正确吗?

+3

你能比“它不工作”更具体吗? – Konerak

回答

3

您的查询需要是这样

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
     prd.employeeno AS `EmployeeNo`, 
     prd.starttime AS `StartTime`, 
     prd.endtime AS `EndTime` 
    FROM production prd 
    LEFT JOIN qualityaudit qua 
    ON prd.id=qua.id 
WHERE COALESCE(qua.starttime, prd.starttime) BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 

您的具体情况,你可以在WHERE子句中使用函数结果的别名作为查询条件(请参阅http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html)。但是您可以使用别名在HAVING子句中搜索,因为MySQL 5.0.2和最多允许HAVING子句引用在SELECT列表或外部子查询中的select_expr中指定的任何列或别名,并且聚合函数,如

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
     prd.employeeno AS `EmployeeNo`, 
     prd.starttime AS `StartTime`, 
     prd.endtime AS `EndTime` 
    FROM production prd 
    LEFT JOIN qualityaudit qua 
    ON prd.id=qua.id 
HAVING `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 

都具有相同的结果

+1

感谢您的帮助,这个查询工作正常,我不需要创建子查询。 – Bryan

2

使用

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
     prd.employeeno AS `EmployeeNo`, 
     prd.starttime AS `StartTime`, 
     prd.endtime AS `EndTime` 
    FROM production prd 
    LEFT JOIN qualityaudit qua 
    ON prd.id=qua.id 
WHERE COALESCE(qua.starttime, prd.starttime) BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 

以上假设你的日期格式/列类型匹配真的...

+0

感谢您的帮助,这个查询工作正常,我不需要创建子查询。 – Bryan

1

不能在WHERE子句中使用别名从SELECT列表。

使用此:

SELECT * 
FROM 
    (SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
      prd.employeeno AS `EmployeeNo`, 
      prd.starttime AS `StartTime`, 
      prd.endtime AS `EndTime` 
     FROM production prd 
     LEFT JOIN qualityaudit qua 
     ON prd.id=qua.id 
) AS tmp 
WHERE `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 

或重复的代码:

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
     prd.employeeno AS `EmployeeNo`, 
     prd.starttime AS `StartTime`, 
     prd.endtime AS `EndTime` 
    FROM production prd 
    LEFT JOIN qualityaudit qua 
    ON prd.id=qua.id 
WHERE COALESCE(qua.starttime, prd.starttime) 
     BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 
+0

感谢您的帮助,这个查询工作正常,我不需要创建子查询。 – Bryan

2

正如其他人指出,你不能使用别名。为了避免两次调用coalesce,可以使用HAVING语句。

SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, 
     prd.employeeno AS `EmployeeNo`, 
     prd.starttime AS `StartTime`, 
     prd.endtime AS `EndTime` 
    FROM production prd 
    LEFT JOIN qualityaudit qua 
    ON prd.id=qua.id 
HAVING `AuditDate` BETWEEN '2011-10-01 00:00:00' AND '2011-10-01 23:59:59'; 
+0

感谢您的帮助,这个查询工作正常,我不需要创建子查询。 – Bryan