2017-01-31 3 views
0

у меня есть таблица с результатами:MySQL - подсчитать количество записей и список людей

date  | user_id | content 
----------------------------------------- 
2017-01-14 | 1  | lorem 
2017-01-02 | 2  | dsfdf 
2017-01-02 | 1  | asfds dsfsda 
2017-01-27 | 3  | sdfdfds fsdf 

И я хочу подсчитывать строки для всех пользователей и получить результат, как этот:

user_id  | count 
----------------------------------------- 
1   | 2 
2   | 1 
3   | 1 

Стараюсь:

select distinct(user_id), count(*) from aso_repairs where date like '2017-01-%' 

Но это не сработает ;-(Любая помощь?

+0

Кстати, 'date> = '2017-01-01' И дата <'2017-02-01'' будет быстрее. – Strawberry

ответ

1

использовать предложения GROUP BY:

SELECT 
    user_id, 
    count(user_id) 
FROM aso_repairs 
WHERE 
    date LIKE '2017-01-%' 
GROUP BY user_id 

Вы не должны использовать count(*), по крайней мере, в версии 3.23 это гораздо дороже, чем count(somecolumn) хотя она дает тот же результат.

+2

"MySQL 3.23"? действительно? :-) –

+0

@PaulSpiegel Последняя версия MySQL, на которой я действительно разбирался. – Alexander

0

Добавить недостающую группу по статье:

SELECT 
    user_id, COUNT(*) 
FROM 
    aso_repairs 
WHERE 
    date LIKE '2017-01-%' 
GROUP BY user_id; 

Кроме того, оператор like не позволит вам использовать любой индекс, если был один на колонке даты. Рассмотрите возможность предоставления фактических границ даты:

SELECT 
    user_id, COUNT(*) 
FROM 
    aso_repairs 
WHERE 
    date BETWEEN '2017-01-01' AND '2017-01-31' 
GROUP BY user_id; 
Смежные вопросы