MySQL LEFT JOIN с дросселями с GROUP BY и агрегатными операторами

0

У меня две таблицы в MySQL: ALUMNI и CALLRES.

Таблица ALUMNI имеет AlumID в качестве основного ключа. Он имеет 14483 рек.

Таблица CALLRES имеет CallKey в качестве основного ключа и имеет поле AlumID, которое индексируется. (Это внешний ключ для ALUMNI, но никаких формальных ограничений, обозначающих это.) CALLRES имеет около 18000 рецентов.

Следующий запрос работает нормально. (0,2 секунды, 14461 строк результатов)

 SELECT    ALUMNI.AlumID, MAX(CALLRES.CallTime), COUNT(CALLRES.Outcome)
 FROM      ALUMNI JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
 GROUP BY  ALUMNI.AlumID

Однако этого не хватает, указав ALUMNI, у которого нет записей CALLRES. (Их не так много: 14483 - 14461 = 22 в настоящее время пропущены).

Я хочу получить их в списке, поэтому я хочу LEFT JOIN вместо JOIN. Я думаю, что добавленные записи будут иметь NULL в совокупных столбцах.

Это разрешено?

Когда я меняю запрос, просто меняя "JOIN" на "LEFT JOIN", я не получаю сообщение об ошибке, но запрос находится на неопределенный срок. Так:

 SELECT    ALUMNI.AlumID, MAX(CALLRES.CallTime), COUNT(CALLRES.Outcome)
 FROM      ALUMNI LEFT JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
 GROUP BY  ALUMNI.AlumID

берет "навсегда". Спасибо за любой совет.

  • 1
    Как и операторы SHOW CREATE TABLE для всех соответствующих таблиц, вопросы о производительности запросов ВСЕГДА требуют РАЗЪЯСНЕНИЯ для данного запроса.
Теги:
group-by
aggregate-functions
left-join

1 ответ

1

Если вы хотите получить недостающий список, вы можете сделать:

SELECT ALUMNI.AlumID
FROM   ALUMNI LEFT JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
WHERE  CALLRES.AlumID IS NULL

ИЛИ ЖЕ

SELECT ALUMNI.AlumID FROM ALUMNI
WHERE ALUMNI.AlumID NOT IN (SELECT AlumID FROM CALLRES)

Я думаю, что первый SQL лучше.

  • 0
    Спасибо за это предложение. Я думаю, что вы правы, и это может решить мою проблему. Но я надеюсь, что кто-то объяснит, что не так с моим подходом. Мне любопытно, почему мой запрос LEFT JOIN душит MySQL ... тем более, что он проходит через обычный запрос JOIN.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню