2012-01-03 2 views
3

Я пытаюсь вытащить информацию о каждой группе пользователей, подсчитывая количество пользователей в каждой. Счетные работы, однако, если группа не содержит пользователей, она не извлекает информацию - она ​​просто игнорируется.Показывать количество пользователей в группах, даже пустых группах

Это мой запрос:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g, 
     users as u 
    WHERE 
     u.usergroup = g.g_id 
    GROUP BY 
     g.group_name 

Это часть моих «пользователей» и «групп пользователей» таблицы:

Sample usergroups table structure 
    +--------------------------+---------------+ 
    | Field     | Type   | 
    +--------------------------+---------------+ 
    | g_id      | int(10)  |<- the user group's ID. 
    | group_name    | varchar(255) |<- the name of the user group 
    +--------------------------+---------------+ 

    Sample users table structure 
    +--------------------------+---------------+ 
    | Field     | Type   | 
    +--------------------------+---------------+ 
    | id      | int(10)  |<- the user ID 
    | username     | varchar(255) |<- the username 
    | usergroup    | int(10)  |<- ID of the user group the user is in 
    +--------------------------+---------------+ 

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

Любая помощь будет очень признательна!

ответ

8

Вы хотите left join, и вы делаете в inner join:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g 
     left join users as u on 
      g.u_id = u.usergroup 
    GROUP BY 
     g.u_id, 
     g.group_name 

Теперь, когда я ваше внимание, я хотел бы занять минуту, чтобы обсудить, что присоединиться условия. Посмотрите, когда вы впервые изучаете MySQL, они учат вас синтаксису, который вы используете. И эй, он отлично работает, для определенных наборов проблем. К сожалению, это заставляет вас приравнивать «условие соединения» к «где предикат», и это проблема.

В этом случае мы говорим, «Эй, MySQL, возьмите меня все вещи из usergroups таблицы, и попытаться найти соответствие в таблицу users где u_id колонны из usergroups равно usergroup столбца из users. Если вы ничего не можете найти, все в порядке, верните usergroup в любом случае и просто удалите столбцы, которые users приводит в таблицу ».

Раньше вы говорили, «Эй, MySQL, возьмите меня все вещи из таблицы usergroups и users, но только там, где u_id колонна из usergroups совпадает с usergroup столбец users

Если вы сделали это с inner join синтаксиса, например:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g 
     inner join users as u on 
      g.u_id = u.usergroup 
    GROUP BY 
     g.u_id, 
     g.group_name 

Вы бы говорили: «Эй, MySQL, возьмите меня все от usergroups стола, а затем найти все в users таблица, где u_id равен usergroup. Если вы не можете найти матч, я не хочу видеть, что группа пользователей появляются в результатах поиска.

Таким образом, чтобы было ясно, где предикаты фильтр результат набора, тогда как j oin условия карта один стол к другому.

+0

Ой, не думаю о выполнении присоединиться к левой. Попробует и отчитаю :). Cheers. – MrE

+0

Отлично! - Левый Join был ответом :) - Привет! Отметьте это как ответ, как только сможете. – MrE

+0

Ох! Большое спасибо за подробное объяснение. Теперь это намного больше. Эрик, большое спасибо за то, что ты потратил время на разработку! – MrE

3

Вы должны использовать LEFT JOIN здесь вместо подразумеваемого INNER JOIN:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g 
    LEFT JOIN users as u ON g.g_id = u.usergroup 
    GROUP BY 
     g.group_name 
+0

Perfect - большое спасибо за помощь. Оценка:!! – MrE

Смежные вопросы