Расширить, чтобы выбрать на основе диапазона данных - PullRequest
2 голосов
/ 11 ноября 2011

У меня следующий запрос 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 дней.

Так что я думаю, что могу изменить вышеуказанный запрос, чтобы выбрать поле 'time' из таблицы 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       |                |
+---------------+---------------------+------+-----+---------+----------------+

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Ответ Марка хорош и дает вам последние 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';
0 голосов
/ 11 ноября 2011

Запросы, вероятно, будут работать лучше, если вы сравните столбец неконвертированной таблицы со значением его собственного типа - например, так:

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, если хотите учесть високосные годы.

...