2013-08-19 2 views
1

У меня есть БД с несколькими таблицами, 2 из которых определяются как:список всех записей и кол-во вхождений в другой таблице

CREATE TABLE [projects] (
    [id] INTEGER   NOT NULL PRIMARY KEY, 
    [code] VARCHAR(128) UNIQUE NOT NULL COLLATE NOCASE, 
    [name] VARCHAR(128) DEFAULT "Not Set" NOT NULL COLLATE NOCASE 
) 

CREATE TABLE [tasks] (
    [id]   INTEGER NOT NULL PRIMARY KEY, 
    [project_id] INTEGER NOT NULL, 
    [notes]  VARCHAR(512) DEFAULT 'Not Set' NOT NULL COLLATE NOCASE, 
    [start]  DATE NOT NULL, 
    [finish]  DATE NOT NULL, 
    [rate_id]   INTEGER DEFAULT 1 NOT NULL 
) 

У меня есть этот запрос, который возвращает список деталей проектов с числом использования:

но, как я выяснил, он будет возвращать список меньшим, чем проекты, если идентификатор проекта не использовался (без задачи с данным идентификатором проекта).

Есть ли способ создать полный список проектов в том же формате для моего текущего запроса и добавить длину, но включить ВСЕ проекты, а для тех, у кого нет заданий, будет 0?

ответ

1

Чтобы получить проекты без задач, используйте left outer join. ifnull функция преобразует любой NULL нулю:

SELECT p.*, IFNULL(COUNT(t.project_id), 0) AS length 
FROM projects AS p 
LEFT JOIN tasks AS t ON p.id = t.project_id 
GROUP BY p.code 
ORDER BY length DESC 
+0

Она работает очень хорошо, смогли бы вы объяснить LEFT JOIN своими словами? Благодарю. –

+0

Что случилось с объяснением Википедии? –

+0

:) ничего, но мне нравится простое английское объяснение другого разработчика. Однако я смотрел на это: _ «Результат левого внешнего соединения (или просто левого соединения) для таблиц A и B всегда содержит все записи« левой »таблицы (A)« _ - довольно ясно :) –

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