2013-12-04 3 views
0

Существует две таблицы подписки и экрана. Для экранов имеется более одной подписки. Я использую этот запрос, чтобы получить все экраны с количеством подписчиков.mysql LEFT JOIN issue

SELECT sc.id, sc.alias, sc.ad_capacity, COUNT(s.id) as ad_count FROM screen sc LEFT JOIN 
subscription s ON sc.id = s.screen_id Group BY (s.screen_id); 

Но, я получаю только экраны, связанные с подписками. Я думаю, что LEFT JOIN должен решить мою проблему. Но это не так.

Спасибо.

ответ

2

Вам необходимо сгруппировать по sc.id, так как s.screen_id будет одинаковым (NULL) для всех экранов, для которых нет подписки, и поэтому все такие экраны в настоящее время группируются в одну результирующую строку.

0

Чтобы больше узнать, MySQL, в отличие от других баз данных, таких как MSSQL, позволяет группировать без выбора каждого элемента в агрегированной функции (sum, min, max и т. Д.) Или части предложения group by. Это недействительно SQL и может вызвать много головных болей, как тот, который у вас есть сейчас.

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

Вкратце, включите все, что вы выбираете в какой-либо совокупной функции или в части предложения группы, чтобы избежать этих головных болей.

+0

Хотя все верно, это, вероятно, не проблема в этом случае. Предполагается, что столбец 'id' является PK в таблице' screen'; таким образом, при группировке на правильной стороне внешнего соединения все выбранные столбцы уже зависят от столбцов группировки и (насколько это верно, как ваш ответ), это не является ни разработкой моего ответа, ни применимым к проблеме. – eggyal