2017-02-16 5 views
0

У меня есть две таблицы, одна - это «Посты», а другая - «Комментарии», которые имеют внешний ключ от Posts. Как отображать сообщения от большинства КомментариевPHP MySQL сортировка внешнего ключа

сообщения Таблицы

+----+-------+--------------+ 
| Id | Name | Message  | 
+====+=======+==============+ 
| 1 | John | John's msg | 
| 2 | Marco | Marco's msg | 
| 3 | Ivan | Ivan's msg | 
+----+-------+--------------+ 

Комментария таблицы, сообщения дана внешнего ключа

+----+-------+--------------+--------+ 
| Id | Name | Comment  | PostId | 
+====+=======+==============+========+ 
| 1 | John | John's msg | 2  | 
| 2 |Joseph |Joseph's msg | 2  | 
| 3 | Ivan | Ivan's msg | 2  | 
| 4 |Natalie|Natalie's msg | 1  | 
+----+-------+--------------+--------+ 

На внешнем интерфейсе страницы сообщений будет отсортировано по идентификатору 2, как это имеет большинство комментариев , затем 1 и пост id 2 как последний.

Решения ТНХ для гурва:

select p.*, 
    (
     select count(*) cnt 
     from comments c 
     where c.postid = p.id 
     ) cnt 
from posts p 
order by cnt desc; 
+4

Давай. Попробуйте что-нибудь. – Strawberry

+1

Вы действительно пробовали что-нибудь или просто пришли сюда для быстрого ответа? – Option

ответ

2

Вы можете найти количество комментариев для каждого поста в подзапросе и присоединиться к нему со столом сообщений выполнять сортировку по найденному подсчету:

select p.* 
from posts p 
left join (
    select postid, count(*) cnt from 
    comments 
    group by postid 
) c on p.id = c.postid 
order by c.cnt desc; 

Если вы собираетесь забрать все сообщения, то вышесказанное будет максимально быстрым.

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

select p.*, 
    (
     select count(*) cnt 
     from comments c 
     where c.postid = p.id 
     ) cnt 
from posts p 
order by cnt desc; 
+0

Что произойдет, если таблицы станут очень большими? Это может замедлить производительность – Energizem

+1

@Energizem - Обновлено с более подробной информацией и альтернативным решением – GurV

+0

1-е решение показывает только сообщения с 1 или более комментариями, сообщения с 0 комментариями не выбраны. Второе решение работает должным образом, спасибо – Energizem

1

Вы должны будете группе Post.Id после присоединения

SELECT Post.Id, Post.Name, Post.Message, 
SUM(CASE WHEN Comment.Id IS NOT NULL THEN 1 END) as Comments 
FROM Post 
LEFT JOIN Comment ON Post.Id = PostId 
GROUP BY Post.Id, Post.Name, Post.Message 
ORDER BY Comments DESC 
+1

@Energizem Я изменю, чтобы использовать 'LEFT JOIN', который должен сделать трюк. – wogsland