n00b提问者在这里。我正在尝试执行查询以检查最近的活动是否在过去24小时内。从技术上讲,我可以得到我想要的结果,但是我的案例陈述中的不平等必须与对我有意义的方向相反。这是我的疑问:
SELECT sqs.registration_id,
MAX(sqs.completed_at) AS 'most recent activity',
DATE_SUB(NOW(), INTERVAL 1 DAY) AS 'one day ago',
'recent activity?' = CASE
WHEN MAX(sqs.completed_at) <
DATE_SUB(NOW(), INTERVAL 1 DAY)
THEN 1
ELSE 0
END
FROM student_quiz_states sqs
WHERE sqs.score = 100
GROUP BY sqs.registration_id
以下是一个示例结果:
XXXXX 2011-08-02 16:23:53 2011-12-05 00:06:05 0
此用户在过去24小时内没有活动,因此最后一个值返回0,正如我想要的那样。
然而,这对我没有任何意义。 case语句不应该返回1,因为第一个日期时间比一天前早得多吗?当我的when_clause包含一个&gt;时,如果返回了我想要的结果,那对我来说是有意义的。而不是&lt;。
任何解释都将不胜感激。
答案 0 :(得分:4)
问题是,您的查询包含'recent activity?' = CASE ... END
,其中应包含CASE ... END AS 'recent activity?'
。前者是一个平等测试,而不是带别名的表达式。看似“反转”行为的原因是,由于CASE
表达式是数字(它的计算结果为0
或1
),MySQL通过转换{来执行数字相等测试当'recent activity?'
表达式给出'recent activity?' = CASE ... END
和 false <时,{1}}到0.0(detailed rules here),CASE
true / em>当它给出0
时。由于MySQL将 true 表示为1
而将 false 表示为1
,因此最终结果与您的预期相反。
(注意:这个答案的早期版本,同时对等同测试与别名做出相同的基本观点,关于 false 和 true 是{{1因为我没有意识到DBMS是MySQL,并且没有意识到某些DBMS在引用别名时允许使用单引号,所以和0
在其他方面是模糊/混淆的。所以如果有的话上面和下面的评论看起来有点奇怪,这是因为他们指的是那个版本。答案的当前状态在很大程度上要归功于那些评论。)