2011-11-11 108 views
2

我有以下MySQL查询:扩展选择基于数据范围

SELECT concat('<a target="_new" href="%%WWWROOT%%/course/user.php?id=1&user=', 
       u.id, 
       '&mode=alllogs">', 
       u.firstname ,' ', 
       u.lastname,'</a>') AS Username, 
     count(*) AS logins , 
     (SELECT count(*) 
     FROM mdl_log 
     WHERE userid = l.userid 
     GROUP BY userid) AS Activity 
FROM mdl_log AS l 
JOIN mdl_user AS u ON l.userid = u.id 
WHERE action LIKE '%login%' 
GROUP BY userid 
ORDER BY Activity DESC 
INTO OUTFILE '/tmp/Total_Logins_With_Total_Activity.txt'; 

我要扩展这个,这样我可以导致基于数据范围,例如说365天。

所以我想我可以改变上面的查询来从mdl_logs表中选择'时间'字段并将其隐藏到天(它是一个unix时间戳),然后仅当时间在最后365天内时选择期。任何帮助赞赏。

mdl_log表具有以下结构:

+--------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+--------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| time | int(10) unsigned | NO | MUL | 0  |    | 
| userid | int(10) unsigned | NO | MUL | 0  |    | 
| ip  | varchar(15)  | NO |  |   |    | 
| course | int(10) unsigned | NO | MUL | 0  |    | 
| module | varchar(20)  | NO |  |   |    | 
| cmid | int(10) unsigned | NO | MUL | 0  |    | 
| action | varchar(40)  | NO | MUL |   |    | 
| url | varchar(100)  | NO |  |   |    | 
| info | varchar(255)  | NO |  |   |    | 
+--------+------------------+------+-----+---------+----------------+ 

mdl_user表如下所示:

+---------------+---------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+---------------+---------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| auth   | varchar(20)   | NO | MUL | manual |    | 
| confirmed  | tinyint(1)   | NO | MUL | 0  |    | 
| policyagreed | tinyint(1)   | NO |  | 0  |    | 
| deleted  | tinyint(1)   | NO | MUL | 0  |    | 
| mnethostid | bigint(10)   | NO | MUL | 0  |    | 
| username  | varchar(100)  | NO |  |   |    | 
| password  | varchar(32)   | NO |  |   |    | 
| idnumber  | varchar(255)  | NO | MUL |   |    | 
| firstname  | varchar(100)  | NO | MUL |   |    | 
| lastname  | varchar(100)  | NO | MUL |   |    | 
| email   | varchar(100)  | NO | MUL |   |    | 
| emailstop  | tinyint(1) unsigned | NO |  | 0  |    | 
| icq   | varchar(15)   | NO |  |   |    | 
| skype   | varchar(50)   | NO |  |   |    | 
| yahoo   | varchar(50)   | NO |  |   |    | 
| aim   | varchar(50)   | NO |  |   |    | 
| msn   | varchar(50)   | NO |  |   |    | 
| phone1  | varchar(20)   | NO |  |   |    | 
| phone2  | varchar(20)   | NO |  |   |    | 
| institution | varchar(40)   | NO |  |   |    | 
| department | varchar(30)   | NO |  |   |    | 
| address  | varchar(70)   | NO |  |   |    | 
| city   | varchar(20)   | NO | MUL |   |    | 
| country  | varchar(2)   | NO | MUL |   |    | 
| lang   | varchar(30)   | NO |  | en_utf8 |    | 
| theme   | varchar(50)   | NO |  |   |    | 
| timezone  | varchar(100)  | NO |  | 99  |    | 
| firstaccess | int(10) unsigned | NO |  | 0  |    | 
| lastaccess | int(10) unsigned | NO | MUL | 0  |    | 
| lastlogin  | int(10) unsigned | NO |  | 0  |    | 
| currentlogin | int(10) unsigned | NO |  | 0  |    | 
| lastip  | varchar(15)   | NO |  |   |    | 
| secret  | varchar(15)   | NO |  |   |    | 
| picture  | tinyint(1)   | NO |  | 0  |    | 
| url   | varchar(255)  | NO |  |   |    | 
| description | text    | YES |  | NULL |    | 
| mailformat | tinyint(1) unsigned | NO |  | 1  |    | 
| maildigest | tinyint(1) unsigned | NO |  | 0  |    | 
| maildisplay | tinyint(2) unsigned | NO |  | 2  |    | 
| htmleditor | tinyint(1) unsigned | NO |  | 1  |    | 
| ajax   | tinyint(1) unsigned | NO |  | 1  |    | 
| autosubscribe | tinyint(1) unsigned | NO |  | 1  |    | 
| trackforums | tinyint(1) unsigned | NO |  | 0  |    | 
| timemodified | int(10) unsigned | NO |  | 0  |    | 
| trustbitmask | int(10) unsigned | NO |  | 0  |    | 
| imagealt  | varchar(255)  | YES |  | NULL |    | 
| screenreader | tinyint(1)   | NO |  | 0  |    | 
+---------------+---------------------+------+-----+---------+----------------+ 
+0

+1包括相关的表格结构。 (如果可以的话,会使+10,...) –

回答

0

查询可能,如果你未转换的表列比较有更好的表现它自己的类型值 - 如下所示:

SELECT concat('<a target="_new" href="%%WWWROOT%%/course/user.php?id=1&user=', 
       u.id, 
       '&mode=alllogs">', 
       u.firstname ,' ', 
       u.lastname,'</a>') AS Username, 
     count(*) AS logins , 
     (SELECT count(*) 
     FROM mdl_log 
     WHERE userid = l.userid 
     GROUP BY userid) AS Activity 
FROM mdl_log AS l 
JOIN mdl_user AS u ON l.userid = u.id 
WHERE l.action LIKE '%login%' AND 
     l.time >= unix_timestamp(adddate(date(now()),interval -365 day) 
GROUP BY userid 
ORDER BY Activity DESC 
INTO OUTFILE '/tmp/Total_Logins_With_Total_Activity.txt'; 

如果你想考虑闰年,你可以使用interval -1 year

1

马克的回答是好,给你最后的365天,加上在区间的上限是微不足道的,但查询是效率较低的比它可能是 - 从mdl_log两次阅读:

SELECT concat('<a target="_new" href="%%WWWROOT%%/course/user.php?id=1&user=', 
      u.id, 
      '&mode=alllogs">', 
      u.firstname ,' ', 
      u.lastname,'</a>') AS Username, 
    SUM(IF(l.action LIKE '%login%', 1, 0)) AS logins, 
    COUNT(*) AS Activity 
FROM mdl_log AS l 
    JOIN mdl_user AS u ON l.userid = u.id 
WHERE l.time BETWEEN 
    UNIX_TIMESTAMP(ADDDATE(now(),INTERVAL -200 day) 
    AND UNIX_TIMESTAMP(ADDDATE(now(),INTERVAL -100 day) 
GROUP BY userid 
HAVING SUM(IF(l.action LIKE '%login%', 1, 0))>0 
ORDER BY Activity DESC 
INTO OUTFILE '/tmp/Total_Logins_With_Total_Activity.txt';