您好,我的查询中存在问题。主要问题是它比较了2个值,并在它看到它大于默认值时对其进行计数。我想要的是当他看到第一个值大于默认值时它将停止而不进行下一次比较。谁能帮我这个。任何形式的帮助将不胜感激。
例如,当他看到TS。TI1
中的值大于默认值时,它将停止并且不会继续与其他TS值进行比较。
这是我的MySQL查询:
SELECT count(*) AS 'late_cnt', employeeid, J.timein ,TS.`date`
FROM timeschedule AS TS
LEFT JOIN employee AS E ON TS.employeeid = E.id
LEFT JOIN jobgrade AS J ON J.id = E.jobGradeid
WHERE TS.employeeid = '1' AND DATE_FORMAT(TS.`date`, '%m %Y') = CONCAT(LPAD(2,2,'0'),' ','2014')
AND ( TS.`TI1` > '09:30:00' OR
TS.`TI2` > '09:30:00' OR
TS.`TI3` > '09:30:00' OR
TS.`TI4` > '09:30:00' OR
TS.`TI5` > '09:30:00' )
答案 0 :(得分:0)
您的问题存在根本性缺陷: SQL是一种声明性语言,您告诉DBMS 您想要的结果,并且(通常)您没有指定如何这些方式结果应该得到。
因此,在找到or
TI1 TS.
或继续评估后,完全由DBMS决定停止评估> '09:30:00'
- 序列。由于性能原因,很可能不会评估以下表达式,但count(*)
的结果应该相同,因为您计算行,而不是字段满足某些条件。
编辑:如果一个或多个TI
- 字段为null
,可能会遇到一些困难,但我会尝试handle the
null -values (e.g. using
coalesce`)而不是搞乱查询执行计划。
答案 1 :(得分:0)
您正在比较TI字段的值,并使用OR
来合并结果。这将选择是否有任何比较为真(因为true OR true
为true
)您想要true or false
或false or true
而不是true or true
。您需要异或运算,或XOR。
试试这个:
SELECT count(*) AS 'late_cnt', employeeid, J.timein ,TS.`date`
FROM timeschedule AS TS
LEFT JOIN employee AS E ON TS.employeeid = E.id
LEFT JOIN jobgrade AS J ON J.id = E.jobGradeid
WHERE TS.employeeid = '1' AND DATE_FORMAT(TS.`date`, '%m %Y') = CONCAT(LPAD(2,2,'0'),' ','2014')
AND ( TS.`TI1` > '09:30:00' XOR
TS.`TI2` > '09:30:00' XOR
TS.`TI3` > '09:30:00' XOR
TS.`TI4` > '09:30:00' XOR
TS.`TI5` > '09:30:00' )
如果任何一个TI字段大于默认值,则会选择一行,但如果多于一个,则不会选择一行。