SQL - Как заказать, используя счетчик из другой таблицы - PullRequest
21 голосов
/ 24 января 2011

1.Блоггеры

blogger_id
1 
2
3

2.Сообщения

post_from_blogger_id
1 
1
1
2
2
3

Как вы можете видеть, блоггер №1 опубликовал больше, чем другие, а блоггер №3 - меньше.Вопрос заключается в том, как создать запрос, который выбирает всех блоггеров и сортирует их по количеству их сообщений?

Ответы [ 6 ]

45 голосов
/ 24 января 2011
 SELECT bloggers.*, COUNT(post_id) AS post_count
    FROM bloggers LEFT JOIN blogger_posts 
    ON bloggers.blogger_id = blogger_posts.blogger_id
    GROUP BY bloggers.blogger_id
    ORDER BY post_count

(Примечание: MySQL имеет специальный синтаксис, который позволяет вам GROUP BY без агрегирования всех значений, он предназначен именно для этой ситуации).

4 голосов
/ 24 января 2011

Использовать подзапросы.

select * from (
    select post_from_blogger_id, count(1) N from Posts
    group by post_from_blogger_id) t
order by N desc
2 голосов
/ 25 января 2011
SELECT b.*
FROM Bloggers AS b
LEFT JOIN (
  SELECT post_from_blogger_id, COUNT(*) AS post_count
  FROM Posts
  GROUP BY post_from_blogger_id
) AS p ON b.blogger_id = p.post_from_blogger_id
ORDER BY p.post_count DESC
2 голосов
/ 24 января 2011

Попробуйте это:

SELECT B.blogger_id,
       B.blogger_name,
       IFNULL(COUNT(P.post_from_blogger_id ),0) AS NumPosts 
From Blogger AS B
LEFT JOIN Posts AS P ON P.post_from_blogger_id = B.blogger_id
GROUP BY B.blogger_id, B.blogger_name
ORDER BY COUNT(P.post_from_blogger_id ) DESC

Это объединяет 2 таблицы и подсчитывает количество записей в таблице Posts. Если их нет, то счетчик равен 0 (IFNULL).

1 голос
/ 16 августа 2016

попробуйте LEFT JOIN для этого вопроса

SELECT DISTINCT(Bloggers.blogger_id),
(select  count(post_from_blogger_id) from Posts 
where Posts.post_from_blogger_id=Bloggers.blogger_id) post_from_blogger_id FROM Bloggers 
LEFT OUTER JOIN Posts ON Bloggers.blogger_id=Posts.post_from_blogger_id 
ORDER BY post_from_blogger_id DESC
0 голосов
/ 24 января 2019

У меня была такая же проблема.Эти ответы не помогли мне.Я использовал такой запрос:

SELECT *
FROM company c
ORDER BY (select count(a.company_id) from asset a where a.company_id = c.id) DESC

На этот вопрос:

SELECT *
FROM bloggers b
ORDER BY (select count(p.post_from_blogger_id) from posts p where p.post_from_blogger_id = b.blogger_id) DESC
...