显示创建表:
CREATE TABLE `calls` (
`fullname` varchar(201) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`lastname` text COLLATE utf8_unicode_ci,
`firstname` text COLLATE utf8_unicode_ci,
`call` datetime DEFAULT NULL,
`phoneNumber` char(12) COLLATE utf8_unicode_ci DEFAULT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
call
存储有关用户拨打电话的日期和时间的信息
我正在尝试选择晚上8点之间至少打过三次电话的所有人。和晚上10点在上个月。
我的查询:
SELECT fullname, call, COUNT(fullname) AS NumberOfCalls
FROM calls
WHERE HOUR(call) IN (20,21) AND datediff(CURDATE(), call) < 30
GROUP BY fullname
HAVING NumberOfCalls >= 3;
查询不提供结果。
如果我发表评论/* AND datediff(CURDATE(), call) < 30 */
,我会吸引所有在晚上8点至晚上10点之间打电话的人。
如果我评论/* HOUR(call) IN (20,21) AND */
,我会吸引上个月来过的所有电话。
WHERE子句不适用于这两种情况,我也不明白为什么。如何使它接受两个条件?谢谢!
答案 0 :(得分:1)
根据您的描述,我认为您的代码应该可以工作。 call
中的SELECT
是不合适的(因为它不是GROUP BY
的一部分)。我建议直接比较日期/时间值:
SELECT fullname, COUNT(*) AS NumberOfCalls
FROM calls c
WHERE HOUR(call) IN (20, 21) AND call >= curdate() - interval 30 day
GROUP BY fullname
HAVING NumberOfCalls >= 3;