SQL - Как заказать, используя подсчет из другой таблицы
1. Блоггеры
blogger_id
1
2
3
2. Сообщения
post_from_blogger_id
1
1
1
2
2
3
Как вы можете видеть, блоггер №1 опубликовал больше, чем остальные, а блоггер №3 - меньше. Вопрос
как создать запрос, который выбирает всех блоггеров и сортирует их по количеству своих сообщений?
Ответы
Ответ 1
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 без агрегирования всех значений, предназначенных именно для этой ситуации).
Ответ 2
Использовать подзапросы.
select * from (
select post_from_blogger_id, count(1) N from Posts
group by post_from_blogger_id) t
order by N desc
Ответ 3
Попробуйте следующее:
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
).
Ответ 4
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
Ответ 5
попробуйте 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
Ответ 6
У меня такая же проблема. Эти ответы не помогли мне. Я использовал такой запрос:
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