Всегда ли этот запрос MySQL возвращает ожидаемый результат? - PullRequest
1 голос
/ 12 ноября 2010

Я написал запрос следующим образом:

  SELECT COUNT(*) AS count, email
    FROM sometable
GROUP BY email
ORDER BY count DESC 
   LIMIT 4

Мне интересно увидеть четыре наиболее повторяющиеся записи электронной почты в таблице.Пока что кажется, что он возвращает именно то, что я хочу:

count   email
12      very-duplicated@email.com
2       duped-twice@email.com
2       also-twice@email.com
1       single@email.com

Когда я не использую LIMIT, я получаю тот же результат (хотя и с большим количеством строк, имеющих число = 1).Что мне интересно, так это LIMIT.В будущем, когда цифры изменятся, мой запрос по-прежнему будет возвращать четыре наиболее часто используемых письма?или запрос должен сканировать всю базу данных, чтобы оставаться точным?

(примечание: я не пытаюсь предотвратить дубликаты, я пытаюсь увидеть наиболее часто используемую электронную почту.)

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010

Ну, во-первых, запрос не только возвращает вам дубликаты записей. Посмотрите на 4-ую строку, в которой указано количество = 1, что означает, что в таблице это встречается только один раз. Чтобы получить список повторяющихся записей, вам нужно изменить запрос как -

SELECT COUNT(*) AS count, email
FROM sometable
GROUP BY email
HAVING COUNT(*) > 1
ORDER BY count DESC     
LIMIT 4

Тогда это всегда вернет вам 4 самых верхних повторяющихся записи в вашей таблице в указанном порядке.

2 голосов
/ 12 ноября 2010

Я не уверен.Но если вы обеспокоены, вы можете применить ограничение для подзапроса:

select *
from 
(
  SELECT COUNT(*) AS count, email
  FROM sometable
  GROUP BY email
  ORDER BY count DESC 
)
limit 4

В качестве альтернативы, вы можете сделать что-то вроде этого, чтобы увидеть все дублированные адреса электронной почты (может вернуть больше или меньше 4):

  SELECT COUNT(*) AS count, email
    FROM sometable
GROUP BY email
having COUNT(email) > 1
ORDER BY count DESC 
...