我有一个由COALESCE语法组成的查询。 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';
任何人都可以帮助我如何正确地查询此查询?
答案 0 :(得分: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和up允许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 :(得分: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';
以上假设您的日期格式/列类型确实匹配...
答案 2 :(得分: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';
答案 3 :(得分:1)
您无法使用SELECT
子句中WHERE
列表中的别名。
使用此:
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';