2014-11-20 2 views
0

У меня есть запрос, который создает таблицу, как следующее:SQL - подсчет количества входов в день, для каждого пользователя

Login_Date  Username 
---------------------------------------------- 
1/1/10   user-1 
1/1/10   user-1 
1/1/10   user-2 
1/2/10   user-1 
1/2/10   user-2 
1/3/10   user-1 
1/3/10   user-1 
1/3/10   user-1 
1/3/10   user-3 

Запрос выглядит следующим образом:

SELECT Date_Used, Name AS licenseNames FROM B, A WHERE A.License_Key = B.License_Key ORDER BY Date_Used ; 

, который отлично , но то, что мне нужно для его создания, - это список дат, где на каждую дату он дает мне список пользователей, которые вошли в этот день, а также сколько раз они вошли в систему. Я просмотрел все, чтобы попытаться найти краткое решение этого, но это было не что иное, как тупики.

В результате я хочу опубликовал бы выглядеть следующим образом:

Login_Date Username # of Times logged in 
-------------------------------------------------- 
1/1/10  user-1  2 
1/1/10  user-2  1 
1/2/10  user-1  1 
1/2/10  user-2  2 
1/3/10  user-1  3 
1/3/10  user-3  1 

Любая помощь будет высоко ценится, это сводит меня с ума.

РЕДАКТИРОВАТЬ

Ниже приведены соответствующие таблицы, чтобы избежать путаницы:

Таблица А Столбцы:

-------------------------- 
ID License_Key Name 

Таблица B Столбцы:

------------------------------ 
ID Date_Used  License_Key 

EDIT 2

По просьбе комментария, все решения до сих пор обеспечили тот же результат на реальных таблиц (хотя SQL Скрипки работает для всех из них, так что ..?)

Результаты I» м получать следующим образом:

Login_Date  UserName  Cnt (or NumLogins for the other solution) 
--------------------------------------------------------------------- 
01-01-10  user-1  1 
01-01-10  user-1  1 
01-01-10  user-2  1 
01-02-10  user-1  1 
01-02-10  user-1  1 
01-02-10  user-1  1 
01-02-10  user-1  1 

и т.д. и т.п. так это выглядит, как группа по команде во всех ответов до сих пор просто не делать .. ничего ?? Очень запутанно ...

+1

Вам следует группировать имя пользователя и дату – bksi

+0

, почему вам нужно соединение? Я не уверен, что IF A или B в вашем SQL ссылается на таблицу с, login_date, но если у другой есть несколько записей в ней для одного и того же License_Key, вы считаете, что не будет. – xQbert

+0

Добавлена ​​информация об rel вывести столбцы/таблицы для ясности. В таблицах больше, но в интересах краткости я их оставил (иначе это была бы глупая структура таблицы!) – WillBD

ответ

1

Вы должны использовать запрос GROUP BY с агрегированной функцией COUNT (*). Поскольку Date_Used столбец DATETIME, он может содержать часть DATE, но и часть времени, так что вы должны извлечь только часть даты, используя DATE() функцию:

SELECT 
    DATE(Date_Used), 
    Name AS licenseNames, 
    COUNT(*) AS logins 
FROM 
    B INNER JOIN A 
    ON A.License_Key = B.License_Key 
GROUP BY 
    DATE(Date_Used), 
    Name 
ORDER BY 
    DATE(Date_Used), 
    Name 
+0

Не уверен, почему это получило понижение голосов. Выглядит неплохо в стороне от желаемых имен столбцов ... и потенциальная проблема с несколькими значениями во 2-й таблице, потенциально вызывающая завышенные счета. – xQbert

+0

Нижняя сторона была потому, что они просто закрыли блок копирования и вставки кода, не объясняя, что они делают. – AdamMc331

+0

принято считать первым, кто поймает этот бизнес DATE. Несмотря на то, что вы должны изменить его в части «Не заполнять», а «Сортировать по», чтобы он работал правильно, еще раз спасибо! – WillBD

1

Что вам нужно реализовать здесь является COUNT() агрегатная функция. Вы можете использовать его с оператором GROUP BY, и он будет подсчитывать количество строк, существующих в вашей группе.

В вашем случае вы хотите группировать пользователя и дату. Я также рекомендую вам использовать объединение вместо:

SELECT date_used, name AS licenseNames, COUNT(*) AS numLogins 
FROM B 
JOIN A ON a.license_key = b.license_key 
GROUP BY date_used, name 
ORDER BY date_used; 

EDIT

Вот SQL Fiddle. Результаты выглядят немного иначе, но я думаю, что вы допустили ошибку, поскольку пользователь-2 только один раз регистрировался один раз в 01/02/10 в соответствии с таблицей, которую у вас есть.

+0

Из-за отношений 1: M это искусственно раздувает отсчеты. – xQbert

+0

Действительно, пользователь-2, регистрирующийся дважды, был ошибкой с моей стороны. Что касается SQL ... я помещаю это одинаково в свое, но по какой-то причине он не будет группировать ничего должным образом ... исследуя сейчас (а именно, он дает одну строку за запись и просто дает мне результат только с '1 в столбце numLogins) – WillBD

+0

Я действительно думал, что это должно сработать, поскольку все ОП, похоже, хотят, чтобы он взял свой существующий запрос и подсчитал количество логинов в день на использование, что это такое, не так ли? – AdamMc331

1

Я использовал внутреннее соединение и дополнительный запрос, чтобы получить счет перед соединением, чтобы иметь дело с отношением 1: M; в противном случае графы будут искусственно завышены.

Я использовал агрегатную функцию счета (*) и группу по получить счетчик license_keys, используемый по дате

SELECT B2.Date_used as Login_date, A.name as UserName, B2.Cnt 
FROM A 
INNER JOIN 
(SELECT date_used, License_Key, count(*) cnt 
FROM B 
GROUP BY date_used, License_key) B2 
ON A.License_key = B2.License_Key 

Я не псевдоним имя столбца на кол, как я не помню, что escape-символ mysql для столбцов ... «или» или [... я не помню.

+0

У меня такая же проблема с этим запросом, как и с решением McAdam331, по какой-то причине я просто получаю счет «1», а перечисленные пользователи несколько раз в день, потому что решения работают в SQLFiddle, я склонен полагать, что это какая-то причуда InnoDB ?? – WillBD

+0

См. Комментарии по другим ответам, это решение также работает, но вам нужно иметь функцию «Date()» вокруг любых полей TIMESTAMP или DATETIME, чтобы они могли правильно группироваться и, следовательно, подсчитывать. Еще раз спасибо! очень тщательный ответ! – WillBD

Смежные вопросы