считать и группировать в иерархии из 3 таблиц с нулями - PullRequest
1 голос
/ 01 июля 2019

У меня есть иерархия из 3 таблиц.

Мне нужен запрос, который возвращает все записи из верхней таблицы и подсчитывает записи в нижней части этой иерархии.

Пример:

table paragraph has columns : id_paragraph
table sentence has columns  : id_sentence, id_paragraph
table word has columns      : id_word, id_sentence, font, color

Пример вывода:

id_paragraph, sentence_count, word_count, word_count_no_font, word_count_font_present, word_count_no_color, word_count_color_present
1, 10, 100, 20, 80, 25, 75
2, 20, 200, 40, 160, 50, 150

Объяснение первой строки: id_paragraph = 1, содержит 10 предложений, сумма слов в этом предложении =100, сумма слов в этом предложении в этом абзаце, где шрифт пуст = 20, сумма слов в этом предложении в этом абзаце, где шрифт не пустой = 80, сумма слов в этом предложении в этом абзаце, где цветempty = 25, сумма слов в этом предложении в этом параграфе, где цвет не пуст = 75.

Я вижу, как «левое соединение» и «группировка по» дают мне решение иерархии из 2 глубоких,Я попытался скрутить SQL JOIN 3 ТАБЛИЦЫ С COUNT И ГРУППИТЬ ПО CLAUSE , но, очевидно, я ничего не понимаю.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Просто используйте count(distinct):

select s.id_paragraph,
       count(distinct s.id_sentence) as num_sentences,
       count(*) as num_words,
       count(w.font) as num_words_with_font,
       sum(w.font is null) as num_words_without_font,
       count(w.color) as num_words_with_color,
       sum(w.color is null) as num_words_without_color
from sentence s join
     word w
     on w.id_sentence = s.id_word
group by s.id_paragraph;
1 голос
/ 01 июля 2019
SELECT p.id_paragraph,
(SELECT COUNT(s.id_sentence) FROM sentence s WHERE p.id_paragraph = s.id_paragraph) sentence_count,
(SELECT COUNT(w.id_word) FROM sentence s, word w WHERE s.id_sentence = w.id_sentence AND p.id_paragraph = s.id_paragraph) word_count,
(SELECT COUNT(IFNULL(w.font, 1)) FROM sentence s, word w WHERE s.id_sentence = w.id_sentence AND p.id_paragraph = s.id_paragraph AND w.font IS NULL) word_count_no_font,
(SELECT COUNT(w.font) FROM sentence s, word w WHERE s.id_sentence = w.id_sentence AND p.id_paragraph = s.id_paragraph AND w.font IS NOT NULL) word_count_font_present
...
FROM paragraph p
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...