2013-09-06 5 views
2

У нас есть таблица с именем entries, которая хранит информацию о пользователях по дате. Пользователям разрешается вводить базу данных один раз в день. Некоторые примеры данных:Подсчитайте количество вхождений другого результата подсчета

+----+------------------+----------+ 
| id |  email  | date | 
+----+------------------+----------+ 
| 1 | [email protected] | 04.09.13 | 
| 2 | [email protected] | 04.09.13 | 
| 3 | [email protected] | 05.09.13 | 
+----+------------------+----------+ 

Мне нужно работать, сколько раз есть X записи с той же электронной почты в базе данных. Например, результат должен выглядеть следующим образом для приведенных выше данных, где мы имеем 1 экземпляр одной записи и 1 экземпляр 2 записей:

+---------------+-------+ 
| times_entered | total | 
+---------------+-------+ 
|    1 |  1 | 
|    2 |  1 | 
+---------------+-------+ 

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

ответ

1

Ниже будет получить количество записей по электронной почте:

SELECT COUNT(1) AS times_entered, email 
FROM entries 
GROUP BY email 

Поэтому, используя этот запрос в качестве производной таблицы, мы можем сгруппировать по количеству записей, чтобы получить счетчик (мы не должны выберите email столбец в подзапрос, потому что мы не заботимся об этом):

SELECT times_entered, COUNT(1) AS total 
FROM 
(
    SELECT COUNT(1) AS times_entered 
    FROM entries 
    GROUP BY email 
) x 
GROUP BY times_entered 

SQL Fiddle demo

SQL Fiddle demo with a slightly larger data set

+0

Спасибо, это работает отлично , Мне на самом деле нужно прочитать промежуточный или продвинутый MySQL на каком-то этапе, я никогда раньше не видел вложенного SELECT. – Marty

4

Обычно это может быть что-то вроде

select times_entered, count(*) from 
(select count(*) times_entered from entries group by email) 
group by times_entered 

Не уверен, если он работает для MySQL, хотя ...

+0

Это должно отлично работать в MySQL :) –

+0

Спасибо за отзыв. Не имея этого под рукой, я спрашиваю себя, может ли быть какое-то ограничение в MySQL SQL. В то время было, но мировые изменения ... :-) – igr

+0

Я считаю, что sub-запросы были введены в 4.1, почти десять лет назад :) –

0

Это может быть что-то вроде этого:

SELECT times_entered, COUNT(times_entered) AS total 
    FROM (
     SELECT COUNT(email) AS times_entered 
     FROM `entries` 
     WHERE 1 
     GROUP BY email 
    ) AS tmp 
GROUP BY times_entered; 
Смежные вопросы