Mysql запрос, чтобы найти самых популярных пользователей - PullRequest
0 голосов
/ 04 августа 2020

У меня есть две таблицы с именами posts и posts_comments со следующей структурой.

таблица сообщений

id username post
1   soju     hi
2   alan     hello
3   soju     hola
4   sam      good morning

таблица posts_comments

id  post_id posted_username  comment
 1    1       jerin             hello
 2    1       jerin             hi
 3    1       catty             good morning
 4    4       catty             hi
 5    3       catty             hello  

где post_id относится к идентификатору таблицы сообщений. я хочу найти 3 самых популярных пользователя, включенных в таблицу сообщений и комментариев, используя один запрос, поэтому результат будет

username  number of post
catty       3
jerin       2
soju        2

, пока у меня есть 2 отдельных запроса и используйте скрипт на стороне сервера, чтобы найти верхние 3

select username,count(*) as number of post group by username from posts

select posted_username as username 
from posts_comments group by posted_username 
from posts_comments

как я могу написать это как один запрос?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Автор также может публиковать комментарии, поэтому вам нужно объединить количество. Здесь эмулируется полное соединение. Я также добавил один дополнительный комментарий пользователя alan в целях тестирования. Но мне не нужно было создавать db-fiddle (это ответственность OP).

См. Db Fiddle

 SELECT * FROM (
   SELECT t1.username, t1.cnt + ifnull(t2.cnt, 0) cnt from (
      SELECT username, count(*) cnt FROM posts group by username
    ) t1
    LEFT JOIN (
      SELECT posted_username, count(*) cnt from post_comments group by posted_username
    ) t2
    ON t1.username = t2.posted_username
  UNION
    SELECT t2.posted_username, t2.cnt + ifnull(t1.cnt, 0) cnt from (
      SELECT username, count(*) cnt FROM posts group by username
    ) t1
    RIGHT JOIN (
      SELECT posted_username, count(*) cnt from post_comments group by posted_username
    ) t2
    ON t1.username = t2.posted_username
 ) sq ORDER BY cnt DESC LIMIT 3


| username | cnt |
| -------- | --- |
| catty    | 3   |
| alan     | 2   |
| soju     | 2   |
1 голос
/ 04 августа 2020

Используйте UNION, чтобы объединить два запроса. Затем вы можете сложить два счетчика вместе, чтобы получить количество сообщений и комментариев и получить верхнюю тройку из этого общего количества.

SELECT username, SUM(number_of_posts) AS number_of_posts
FROM (
    SELECT username, COUNT(*) AS number_of_posts
    FROM posts
    GROUP BY username
    UNION ALL
    SELECT posted_username AS username, COUNT(*) AS number_of_posts
    FROM posts_comments
    GROUP BY posted_username
) AS combined
ORDER BY number_of_posts DESC
LIMIT 3

Убедитесь, что вы используете UNION ALL. По умолчанию UNION удаляет дубликаты, поэтому, если у пользователя одинаковое количество сообщений и комментариев, они не будут учитываться.

Также вам необходимо проверить синтаксис запросов SELECT - порядок clauses не является гибким, как вы их написали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...