Найти количество объединений по справочной таблице - PullRequest
2 голосов
/ 21 апреля 2011

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

В моей базе данных есть таблица J, которая объединяет таблицы A и B. То есть, J имеет столбцы a_id и b_id, которые содержат идентификатор записей в A и B соответственно.В B также есть столбец «code»;в качестве примера, скажем, есть три записи с кодами «CC», «DD» и «EE».

Теперь я хочу написать запрос, в котором перечисляется, сколько А имеют каждый типкода в B (сколько A имеет «CC», сколько «DD» и сколько EE).

Я пишу этот запрос следующим образом и получаю следующий вывод (сфабрикованные данные, конечно - отсортировано по алфавитному порядку кода):

SELECT b.CODE as code, COUNT(*) AS COUNT FROM a, b, j
  WHERE j.a_id = a.id AND j.b_id = b.id
  GROUP BY b.CODE ORDER BY b.CODE

code  |  count
==============
CC    |  5
DD    |  10
EE    |  2

Проблема возникает, когда я добавляю новую запись в B, скажем, с кодом 'FF'.Теперь у меня нет записей в J, которые указывают на код «FF».Таким образом, в выводе я хочу включить 'FF', но показать, что счетчик равен 0 (A не присоединены к 'FF').

code  |  count
==============
CC    |  5
DD    |  10
EE    |  2
FF    |  0

Однако, с моим текущим запросом, он не 't делает это и фактически пропускает все коды, где итоговое число равно 0.

Могут ли какие-либо мастера запросов помочь мне изменить мой запрос, включив счетчики для всех кодов, равны ли они нулю или нет?Это будет с благодарностью.

  • Ян

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Вам нужно будет использовать LEFT JOIN здесь, чтобы сделать это. LEFT JOIN выдаст вам все строки из таблицы b, независимо от того, имеют ли они совпадающие строки в таблице j.

SELECT b.CODE as code, COUNT(a.id) AS COUNT 
    FROM b
        LEFT JOIN j
            INNER JOIN a
                ON j.a_id = a.id
            ON j.b_id = b.id
    GROUP BY b.CODE 
    ORDER BY b.CODE
1 голос
/ 21 апреля 2011

Вам нужно использовать левое соединение:

SELECT b.CODE as code, COUNT(a.id) AS a_count
FROM b LEFT JOIN (j JOIN a ON j.a_id = a.id) ON j.b_id = b.id
GROUP BY b.CODE ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...