Вопрос:
Таблица выглядит примерно так:
date name count 2013-1-1 Jack 20 2014-3-8 Jack 3 2014-3-1 Tom 1 2014-3-1 Jack 7 2014-2-28 Mary 4 2014-2-28 Tom 5
Я хочу написать запрос, чтобы вывести человека с их общим количеством в течение последних 30 дней
eg. Jack 10 Tom 6 Mary 4
Каков самый простой SQL для этого?
Лучший ответ:
Обновление: запрос, предложенный @MatBailie
mysql> SELECT -> name, -> SUM(count) as total_count -> FROM table_name -> WHERE ‘date’ >= DATE_SUB(NOW(), INTERVAL 30 day) AND ‘date’ <= NOW() -> GROUP BY name -> ; +——+————-+ | name | total_count | +——+————-+ | Jack | 10 | | Mary | 4 | | Tom | 6 | +——+————-+ 3 rows in set (0.02 sec)
Старый ответ:
Пытаться:
SELECT name, SUM(count) as total_count FROM table_name WHERE ABS(DATEDIFF(‘date’ , now())) < 30 GROUP BY name
Это работает:
mysql> create table table_name (‘date’ datetime, name char(20), count int); Query OK, 0 rows affected (0.21 sec) mysql> insert into table_name values -> (‘2013-1-1’, ‘Jack’, 20), -> (‘2014-3-8’, ‘Jack’, 3), -> (‘2014-3-1’, ‘Tom’, 1), -> (‘2014-3-1’, ‘Jack’, 7), -> (‘2014-2-28’, ‘Mary’, 4), -> (‘2014-2-28’, ‘Tom’, 5); Query OK, 6 rows affected (0.12 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT -> name, -> SUM(count) as total_count -> FROM table_name -> WHERE ABS(DATEDIFF(‘date’ , now())) < 30 -> GROUP BY name; +——+————-+ | name | total_count | +——+————-+ | Jack | 10 | | Mary | 4 | | Tom | 6 | +——+————-+ 3 rows in set (0.00 sec)
Изменение: на основе комментария:
если я хочу получить первое имя с наивысшим счетом, которое есть Джек и Том. Как это сделать?
Используйте ORDER BY DESC и LIMIT, проверьте следующий запрос с результатом.
mysql> SELECT -> name, -> SUM(count) as total_count -> FROM table_name -> WHERE ‘date’ > DATE_SUB(NOW(), INTERVAL 30 day) and ‘date’ < NOW() -> GROUP BY name -> ORDER BY total_count DESC -> LIMIT 2; +——+————-+ | name | total_count | +——+————-+ | Jack | 10 | | Tom | 6 | +——+————-+ 2 rows in set (0.03 sec) Ответ №1
Вы можете использовать:
SELECT name, SUM(count) FROM table_name WHERE date >= ( CURDATE() — INTERVAL 30 DAY ) GROUP BY name;