присоединиться к SQL-запросу для анализа значений - PullRequest
1 голос
/ 21 сентября 2011

У меня есть таблица entries с тремя столбцами: id, name, display_name.
Мне нужно написать запрос с объединением, который проверит, сколько существует display_names для каждого имени и отобразит только те имена, которые имеют несколько display_names.
Это должно быть довольно просто, чтобы написать с объединениями. Прежде чем я использовал следующий запрос:

SELECT e1.name 
FROM entries e1 
WHERE (
  SELECT COUNT(DISTINCT e2.display_name) 
  FROM entries e2 
  WHERE e2.name = r1.name
) > 1;

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Вам не нужно объединение.

SELECT e1.name 
FROM entries e1 
GROUP BY e1.name
HAVING COUNT(*) > 1

Обратите внимание, что вы можете использовать псевдоним в предложении has, поэтому заимствуя у @ Scorpi0 и @Widor, вы также можете сделать:

SELECT e1.name, COUNT(DISTINCT e1.display_name) as occurrences
FROM entries e1 
GROUP BY e1.name
HAVING occurrences > 1

Причина, по которой это разрешено, заключается в том, что having оценивается после того, как все остальные элементы в выборе сделаны. К тому времени содержимое псевдонима станет известно.
Вы не можете использовать этот псевдоним в предложении WHERE, потому что он запускается (или может выполняться) до того, как MySQL знает, что в псевдониме.

3 голосов
/ 21 сентября 2011

Вам не нужно объединение, предложение HAVING может сделать фильтр для вас:

SELECT e1.name 
FROM entries e1 
GROUP BY e1.name
HAVING COUNT(DISTINCT e1.display_name) > 1
1 голос
/ 21 сентября 2011
SELECT name, COUNT(display_name)
FROM entries
GROUP BY name
HAVING COUNT(display_name) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...