如果标题没有达到我想达到的目的,我道歉。自从我编写任何东西以便热身以来已经有一段时间我正在跳进我的一些旧代码来刷新自己并希望提高效率。
我想知道的是,是否可以在数据库字段中计算四次不同的条目数,每次WHERE子句中的字段都会更改值 - 但所有一个查询都是如此。甚至可能没有正确地询问,所以我将解释我正在尝试做什么。
我正在为脚本做一些基本的登录跟踪。我想知道用户登录的四个时间范围:最多24小时前,最多7天前,一个月前以及脚本的生命周期。
目前我正在做一些事情:
$query=mysql_query("SELECT ID FROM USERTABLE WHERE Time>=LOGINTIME);
我在WHERE子句中使用不同的“Time”值运行该查询四次。我一直在玩COUNT()函数,但我似乎无法找到一种方法来发出一个符合我所有需求的查询(而不是四个)。任何帮助将不胜感激。
答案 0 :(得分:3)
SELECT
ID,
COUNT(*) login_count0,
SUM(CASE WHEN LOGINTIME >= Time1 THEN 1 END) login_count1,
SUM(CASE WHEN LOGINTIME >= Time2 THEN 1 END) login_count2,
SUM(CASE WHEN LOGINTIME >= Time3 THEN 1 END) login_count3
FROM USERTABLE
GROUP BY ID
答案 1 :(得分:1)
使用UNION,如@AlexP建议的那样,您可以根据要求选择数据。下面是T-SQL(SQL Server)中的示例,但UNION可用于所有主要数据库。
DECLARE @User TABLE (
UserId INT,
LoginTime DATETIME
)
INSERT @User VALUES
(1, '2012-01-01 11:00'),
(1, '2012-02-01 11:00'),
(1, '2012-02-02 11:00'),
(1, '2012-02-03 11:00'),
(1, '2012-03-01 11:00'),
(1, '2012-03-02 11:00'),
(1, '2012-03-03 11:00'),
(1, '2012-03-04 11:00'),
(1, '2012-03-05 11:00'),
(1, '2012-08-01 11:00'),
(1, '2012-09-01 11:00'),
(1, '2012-10-01 11:00'),
(1, '2012-11-01 11:00'),
(1, '2012-12-01 11:00'),
(1, '2013-01-01 11:00'),
(1, '2013-02-01 11:00'),
(1, '2013-03-01 11:00'),
(1, '2013-04-01 11:00'),
(1, '2013-05-01 11:00'),
(1, '2013-06-01 11:00'),
(1, '2013-07-01 11:00'),
(1, '2013-08-01 11:00'),
(1, '2013-09-01 11:00'),
(1, '2013-10-01 11:00'),
(1, '2013-11-01 11:00'),
(1, '2013-11-02 11:00'),
(1, '2013-11-03 11:00'),
(1, '2013-11-20 11:00'),
(1, '2013-11-20 11:00'),
(1, '2013-11-21 11:00'),
(1, '2013-11-21 12:00'),
(1, '2013-11-21 13:00')
SELECT 'today', COUNT(*)
FROM @User
WHERE LoginTime >= '2013-11-21'
UNION
SELECT 'last 7 days', COUNT(*)
FROM @User
WHERE LoginTime >= '2013-11-14'
UNION
SELECT 'last month', COUNT(*)
FROM @User
WHERE LoginTime >= '2013-10-21'
UNION
SELECT 'ever', COUNT(*)
FROM @User