基于最大派生值选择行

unftdfkk  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(337)

我需要展示一组人中最受关注的人。

SELECT * FROM User
JOIN(
SELECT DISTINCT f.followee_id, COUNT(*) as cnt
FROM Follow f
GROUP BY f.followee_id
ORDER BY cnt desc) derv_table
WHERE User.id = derv_table.followee_id

此表中的结果

id  |             email             |  zipcode   | followee_id | cnt 
 -----|-------------------------------|------------|-------------|----- 
   80 | kkiehn@example.com            | 81629-3826 |          80 |   2 
   39 | berenice.predovic@example.com | 90222-0327 |          39 |   2 
    4 | schaden.lea@example.com       | 35465-6959 |           4 |   2 
  100 | kathryne.braun@example.org    | 80558-1775 |         100 |   2 
   11 | auer.sterling@example.net     | 06562-5156 |          11 |   1 
   49 | arlie.ortiz@example.org       | 69874-3485 |          49 |   1 
   78 | beahan.andreanne@example.net  | 73719-7076 |          78 |   1 
   13 | kaitlyn28@example.com         | 16426-2360 |          13 |   1

因为followee\u id和id是同一个键,所以我一直在排序哪些人拥有最多的追随者。
这个表继续,cnt是一个派生的(或计算的值),我如何只显示包含cnt最大值的行(对于有最大值的n个记录,所以限制是不够的)我尝试了各种连接和不同的条件,但都没有得到任何结果。

iswrvxsc

iswrvxsc1#

在早于8+的mysql版本中,我们可以使用子查询:

SELECT * FROM User u
INNER JOIN
(
    SELECT f.followee_id, COUNT(*) AS cnt
    FROM Follow f
    GROUP BY f.followee_id
) t
ON u.id = t.followee_id
WHERE
    t.cnt = (SELECT COUNT(*) FROM Follow
             GROUP BY followee_id ORDER BY COUNT(*) DESC LIMIT 1);

在mysql 8+或更高版本中,我们可以利用 RANK 分析函数:

WITH cte AS (
    SELECT *,
        RANK() OVER (ORDER BY t.cnt DESC) rnk
    FROM User u
    INNER JOIN
    (
        SELECT f.followee_id, COUNT(*) AS cnt
        FROM Follow f
        GROUP BY f.followee_id
    ) t
    ON u.id = t.followee_id
)

SELECT *
FROM cte
WHERE rnk = 1;

相关问题