Как получить количество сообщений по каждой теме, используя MySql Join - PullRequest
0 голосов
/ 12 мая 2018

Я пытался реализовать несколько запросов MySql Join.

У меня есть три таблицы, а именно "топики", "посты" и "пользователи".Это схема, которую я имею для этих таблиц.enter image description here

Я пытаюсь получить название темы, содержание темы, имя автора темы, дату создания темы и количество сообщений, которые она имеет для всех тем.На данный момент в таблице «тем» имеется 20 записей, а в каждой теме - 5 записей.Итак, таблица записей имеет 100 строк.

Я пробовал следующий запрос и ожидал получить 20 строк из набора результатов.

SELECT t.id
     , t.name
     , u.user_name
     , DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') created_at
     , COUNT(p.id) reply_count 
  FROM topics t 
  JOIN users u 
    ON t.user_id = u.id 
  JOIN posts p 
    ON p.topic_id = t.id

Но я не смогчтобы получить желаемый результат.Я получаю только одну строку в выводе с "reply_count", равным 100 (у меня есть 100 записей в таблице "posts")

Я чувствую, что что-то не так в "COUNT (p.id)) как reply_count "часть запроса.Я попытался удалить эту часть с помощью чего-то вроде ... например, "p.id as reply_count"

Вот как выглядит измененный запрос

SELECT t.id
     , t.name
     , u.user_name
     , DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') created_at
     , p.id reply_count 
  FROM topics t 
  JOIN users u 
    ON t.user_id = u.id 
  JOIN posts p 
    ON p.topic_id = t.id

Это дает мне 100 строк в результате, чтоэто правильно.

В принципе, я застрял в получении количества сообщений для каждой темы.Где я неправ?Не могли бы вы представить свои предложения?

Редактировать :

Попытка смоделировать, какие таблицы у меня есть и какие результаты я ожидаю ----

Это Sqlfiddle из того, что я пытался

Ожидаемый результат - 5 строк, каждая строка содержит идентификатор темы, имя темы, тело темы, имя пользователя создателя темы, время создания темы и "номер"сообщений по каждой теме "

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Попытка еще раз:

select topics.id, topics.name, topics.body, users.user_name, topics.created_at, post_count.qty
from topics, users, posts,
(select topic_id, count(id) as qty from posts group by posts.topic_id) as post_count
where topics.id = posts.topic_id
and users.id=topics.user_id
and posts.topic_id = post_count.topic_id
group by posts.topic_id
0 голосов
/ 13 мая 2018

Опубликовать это как ответ на тот случай, если кто-то еще посчитает это полезным

Следующие запросы работали для меня, Этот очистил некоторые заблуждения Я должен был использовать GROUP BY

SELECT t.id
     , t.name
     , u.user_name
     , DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') as created_at
     , p.reply_count 
  FROM topics t  
  JOIN users u 
    ON t.user_id = u.id  
  join (select id
            ,topic_id
            , count(id) reply_count 
         from posts 
       group 
           by topic_id
     ) p 
    ON p.topic_id = t.id;

И

SELECT t.id
     , t.name
     , u.user_name
     , DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') as created_at
     , COUNT(p.id) as reply_count 
  FROM topics t 
  JOIN users u 
    ON t.user_id = u.id 
  JOIN posts p 
    ON p.topic_id = t.id 
group by t.id;
0 голосов
/ 12 мая 2018

Все, что вам нужно добавить еще один подзапрос, чтобы получить количество ответов по теме отдельно, а затем объединить с основными таблицами, как показано ниже.

SELECT t.id,t.name, u.user_name, DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') as created_at,
p.reply_count
FROM topics t 
JOIN users u ON t.user_id = u.id 
join (select id,count(topic_id) reply_count from post group by id) p ON p.topic_id = t.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...