Представление данных на трех таблицах в MySQL

Давайте предположим, что у меня есть три таблицы, такие как:

Таблица А

id | id_b | id_c
-----------------
1  |   1  |  2
2  |   2  |  1
3  |   1  |  2
4  |   2  |  3
5  |   3  |  3
6  |   2  |  1

Таблица Б

id | name
-----------------
1  | 'One'
2  | 'Two'
3  | 'Three'

Таблица С

id | name
-----------------
1  | 'Alpha'
2  | 'Beta'
3  | 'Charlie'

Что мне нужно, так это подсчет таблицы A на разных парах таблицы B и таблицы C, которая в этом примере выглядит следующим образом:

Результат

    B   |     C      | count(table_a)
-------------------------------------
'One'   |  'Alpha'   |  0
'One'   |  'Beta'    |  2
'One'   |  'Charlie' |  0
'Two'   |  'Alpha'   |  2
'Two'   |  'Beta'    |  0
'Two'   |  'Charlie' |  1
'Three' |  'Alpha'   |  0
'Three' |  'Beta'    |  0
'Three' |  'Charlie' |  1

Мне удалось отобразить строки с ненулевыми значениями, но я не могу отобразить остальные. Заранее спасибо за вашу помощь!

1 ответ

Решение

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

select b.name, c.name, count(a.id)
from (b join c)
left join a on b.id=a.id_b and c.id=a.id_c
group by b.name, c.name

Скобки вокруг b join c гарантирует, что MySQL сначала создаст декартово соединение. Декартово соединение в MySQL может быть выполнено простым внутренним соединением без критерия соединения.

Другие вопросы по тегам