关于合并语法的MySQL条件

关于合并语法的MySQL条件,mysql,coalesce,Mysql,Coalesce,我有一个由合并语法组成的查询。COALESCE语法只是查找文件的审核日期。在WHERE语句中,我只想从AuditDate别名字段输出已审核的文件库,但我不工作。这是我的问题 SELECT COALESCE(qua.starttime, prd.starttime) AS `AuditDate`, prd.employeeno AS `EmployeeNo`, prd.starttime AS `StartTime`, prd.endtime AS `En

我有一个由合并语法组成的查询。COALESCE语法只是查找文件的审核日期。在WHERE语句中,我只想从
AuditDate
别名字段输出已审核的文件库,但我不工作。这是我的问题

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';
有人能帮助我如何正确处理此查询吗?

使用

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';

以上假设您的日期格式/列类型确实匹配…

您的查询需要如下所示

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
子句中将来自函数结果的别名用作查询条件(请参阅)。但是您可以使用别名在
HAVING
子句中搜索,因为MySQL 5.0.2和更高版本允许
HAVING
子句引用select列表或外部子查询中select表达式中命名的任何列或别名,并聚合函数,如

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';

两者的结果相同

您不能使用
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';

您不能像其他人指出的那样使用别名。为了避免两次调用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';

你能比“它不工作”更具体一些吗?谢谢你的帮助,这个查询很好,我不需要创建子查询。谢谢你的帮助,这个查询很好,我不需要创建子查询。谢谢你的帮助,这个查询很好,我不需要创建子查询。谢谢你的帮助,这个查询工作正常,我不需要创建子查询。