SQL-запрос, считать с 0 - PullRequest
       18

SQL-запрос, считать с 0

11 голосов
/ 31 августа 2008

У меня есть три таблицы: страница, вложение, страница-вложение

У меня есть такие данные:

page
ID    NAME
1     first page
2     second page
3     third page
4     fourth page

attachment
ID    NAME
1     foo.word
2     test.xsl
3     mm.ppt

page-attachment
ID    PAGE-ID   ATTACHMENT-ID
1     2         1
2     2         2
3     3         3

Я хотел бы получить количество вложений на странице также, когда это число равно 0 . Я пробовал с:

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    inner join page-attachment on page.id=page-id 
group by page.id

Я получаю этот вывод:

NAME        ATTACHMENTSNUMBER
second page  2
third page   1

Я хотел бы получить этот вывод:

NAME        ATTACHMENTSNUMBER
first page   0
second page  2
third page   1
fourth page  0

Как мне получить 0 часть?

Ответы [ 6 ]

27 голосов
/ 31 августа 2008

Измените свое "внутреннее объединение" на "левое внешнее объединение", что означает "получить все строки слева от объединения, даже если справа нет подходящей строки".

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    left outer join page-attachment on page.id=page-id 
group by page.name
8 голосов
/ 17 сентября 2008

Вот еще одно решение с использованием подзапроса.

SELECT
  p.name,
  (
    SELECT COUNT(*) FROM [page-attachment] pa
    WHERE pa.[PAGE-ID] = p.id
  ) as attachmentsnumber
FROM page p
3 голосов
/ 27 января 2015

В зависимости от базы данных для скорости вы можете использовать команду UNION.

SQL длиннее, но, в зависимости от базы данных, он ускоряет работу, разделяя «считать вещи, которые есть» и «считать вещи, которых нет».

(
select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
inner join page-attachment on page.id=page-id 
group by page.id
)
UNION
(
select page.name, 0 as attachmentsnumber 
from page
where page.id not in (
    select page-id from page-attachment)
)   

База данных, для которой мне нужно это решение, содержит 20 страниц в более чем миллионе вложений. UNION заставил его работать за 13 секунд, а не так долго, как мне стало скучно, и я попробовал другой способ (где-то за 60 секунд до того, как я уничтожил методы внешнего соединения и подзапроса).

1 голос
/ 31 августа 2008

LEFT присоединиться - твой друг. Чтобы узнать больше о различных типах соединения, обратитесь к http://en.wikipedia.org/wiki/Join_(SQL)

1 голос
/ 31 августа 2008

Вы хотите левое соединение вместо внутреннего соединения, так как это позволяет не существовать записям.

0 голосов
/ 27 января 2015

Используйте это:

SELECT p.name,(
    SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...