Подсчитывать комментарии для каждой строки Union и Left Join

См. Образец данных ниже.

Вот что у меня есть на данный момент.

SELECT 
    table1.stuff, 
    COUNT(table1.id) AS row_count, 
    COUNT(comment_table.id) AS comment_count 

FROM table1 
    LEFT JOIN comment_table 
        ON table1.id = comment_table.page_id 
            AND comment_table.page_type = 'nofun'

UNION 

SELECT 
    table2.stuff, 
    COUNT(table2.id) AS row_count, 
    COUNT(comment_table.id) AS comment_count 

FROM table2 
    LEFT JOIN comment_table 
        ON table2.id = comment_table.page_id 
            AND comment_table.page_type = 'fun' 

Пример таблицы данных1:

id     stuff
1      the stuff
2      other stuff

Пример таблицы данных2:

id     stuff
1      the stuff still
2      other stuff still

Пример данных comment_table:

id     page_id     page_type     comment 
5      1           fun           Ello
6      2           nofun         hey janis

Желаемые результаты:

stuff              comment_count    row_count
the stuff still    1                2
other stuff        1                0 

логика выборки данных: Я хочу вернуть все строки из таблиц table1 и table2. Я также хотел бы получить общее количество комментариев из comment_table, связанных с каждой строкой из table1 и table2, и, наконец, подсчитать общее количество строк, возвращенных из table1 и table2.

table1 и table2 имеют "page_type", в этом случае table1 - "nofun", а table2 - "fun". Каждая строка comment_table связана либо с table1, либо с table2 своим "page_type" И "page_id", идентификатором строки table1 или table2.

table1 id: 2 имеет один комментарий (comment_table id: 6), а table2 id: 1 - один комментарий (comment_table id: 5).

В таблице желаемых результатов показаны две образцы строк с «материалом» из таблиц table1 и table2, а также количество комментариев для каждой строки и общее количество строк.

Я не думаю, что полностью понимаю левое соединение. Как я могу достичь своей цели?

Примеры данных и желаемые результаты действительно помогут.

Gordon Linoff 18.10.2018 04:45

Выполнено. Спасибо за предложение.

DaedBaet 18.10.2018 05:11

Какова корреляция между вашими выборочными данными и ожидаемым результатом. Пожалуйста, уточните логику в вопросе

Madhur Bhaiya 18.10.2018 06:10

Выполнено. Спасибо за предложение.

DaedBaet 18.10.2018 06:59

Желаемый результат не соответствует ни данным образца, ни вашему описанию. Откуда проявляется "бла-бла"? Это не часть ваших данных выборки. «Я хочу вернуть все строки из таблиц table1 и table2» Где это можно увидеть? Откуда взялось "row_count"? Я не вижу ни комментария, ни идентификатора таблицы, ни строки таблицы, где у вас есть что-то со счетчиком 2 и что-то со счетом 0. Кроме того, вы, вероятно, захотите добавить group_by, если вы используете count (хотя я не уверен, что вы группируете по).

Solarflare 18.10.2018 09:41

Обычно: если у вас есть страницы двух разных типов, поместите их в одну таблицу и добавьте для нее столбец page_type. Затем добавить тип страницы так же просто, как найти для него третье слово, и вам не нужно добавлять новую таблицу и изменять каждый имеющийся у вас запрос (например, добавление еще одного объединения).

Solarflare 18.10.2018 09:41

@Solarflare, спасибо, что заглянули. Я исправил данные о желаемых результатах выше (было уже поздно, и мне следовало ждать публикации). «Row_count» есть в каждом выбранном выше, и в желаемых результатах «row_count» равно 2, потому что были возвращены две строки. Пожалуйста, дайте мне знать, если я могу добавить что-нибудь, чтобы прояснить что-то непонятное.

DaedBaet 18.10.2018 20:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
64
1

Ответы 1

БОЛЬШОЕ спасибо @Solarflare за указание на отсутствие GROUP BY.

Вот что мне было нужно:

SELECT 
    `table1`.`stuff`, 
    COUNT(`comment_table`.`id`) AS comment_count 

FROM `table1` 
    LEFT JOIN `comment_table` 
        ON `table1.id` = `comment_table`.`page_id` 
            AND `comment_table`.`page_type` = 'nofun' 
GROUP BY `table1`.`id`

UNION 

SELECT 
    `table2`.`stuff`, 
    COUNT(`comment_table`.`id`) AS comment_count 
FROM `table2` 
    LEFT JOIN `comment_table` 
        ON `table2`.`id` = `comment_table`.`page_id` 
            AND `comment_table`.`page_type` = 'fun'
GROUP BY `table2`.`id`

Результаты данных:

stuff              comment_count
the stuff still    1
other stuff        1

Я удалил "row_count", так как данные правильно сгруппированы. Я могу получить общее количество строк из $ page-> num_rows.

Спасибо всем, кто нашел время, чтобы просмотреть мой вопрос, и, конечно же, тем, кто нашел время, чтобы прокомментировать.

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