MySQL оставил количество соединений - PullRequest
2 голосов
/ 15 октября 2011

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

SELECT * , COUNT(list.id) AS listcount, COUNT(uploads.id) AS uploadcount 
FROM members 
LEFT JOIN lists ON members.id= list.mid
LEFT JOIN uploads ON members.id= uploads.mid
GROUP BY members.id

Предположим, что пользователь может иметь списки или загрузки на основетип пользователя.Тогда достаточно ли вышеупомянутый запрос?Если нет, то почему?

Или я должен использовать этот запрос?

SELECT * , l.listcount,   u.uploadcount 
FROM members 
LEFT JOIN (select count(lists.id) as listscount,mid from lists group by mid) as l
                                                                on l.mid = m.id
LEFT JOIN (select count(uploads.id) as uploadscount
                           ,mid from uploads group by mid) as u on u.mid = m.id
GROUP BY members.id

Или коррелированные подзапросы?

SELECT *,
      (select count(lists.id) as listscount from lists as l where l.mid = m.id
       group by mid) as listcount
      (select count(uploads.id) from uploads as u where u.mid = m.id
       group by mid) as uploadscount 
FROM members 
GROUP BY members.id

И какое решение лучше?

1 Ответ

1 голос
/ 15 октября 2011

Псевдоним m для членов отсутствует в запросах 2 и 3. В противном случае они должны давать одинаковые номера.

Запрос 2 (фиксированный) будет выполняться быстрее.

Запрос 1отличается тем, что это даст большее число для uploads, если есть случаи, кратные lists на member.После присоединения к lists будет также несколько строк для члена, что увеличит число для uploads.Так что запрос 1, вероятно, неправильный .

Кроме того, значения NULL не учитываются .Руководство сообщает :

COUNT (expr)

Возвращает счетчик числа ненулевых значений expr в строках, извлеченных оператором SELECT.,Результатом является значение BIGINT.

...