Соединение таблиц, когда определенная таблица не имеет значений? - PullRequest
0 голосов
/ 19 августа 2010

У меня есть эти таблицы:

USER TABLE
uid | name | role
    |      |
1   | bob  | package 1
2   | jill | package 2
3   | pam  | package 1

NODE TABLE
nid | uid | type
    |     |
1   | 1   | car
2   | 1   | car
3   | 1   | car
4   | 2   | page
5   | 1   | car
6   | 3   | car

Если я сделаю:

select u.uid, u.name, count(nid) as totalNodes from USER as u left join NODE on n.uid = u.uid where n.type = 'car' group by u.uid

Я получу:не входит.Зачем?И как я могу избежать этого?Т.е. я хочу, чтобы Джилл также появилась в списке, но с totalNodes как 0 (или даже NULL).

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Вам нужно выполнить агрегирование, прежде чем пытаться объединить таблицы, так как то, что вы в данный момент делаете, это оставление соединения, затем ограничение данных (в этот момент исключается Джилл), а затем группировка.Если вы выполните подсчет и ограничение в подзапросе, вы можете затем присоединить эти результаты к пользовательской таблице и получить желаемый результат:

SELECT u.uid, u.name, IFNULL(c.nodecount,0) AS `count`
FROM USER u LEFT JOIN (
    SELECT uid, `type` , COUNT(nid) AS nodecount
    FROM node
    WHERE TYPE = 'car'
    GROUP BY uid, type
) AS c ON u.uid = c.uid
0 голосов
/ 19 августа 2010

используйте RIGHT JOIN вместо левого,

попробуйте:

select u.uid, u.name, count(nid) as totalNodes from USER as u
right join NODE on n.uid = u.uid where n.type IS NULL or n.type = 'car' group by n.uid

см. Этот превосходный пост визуальное объяснение объединений:

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

MySQL синтаксис объединения:

http://dev.mysql.com/doc/refman/5.0/en/join.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...