根据派生值最大值选择行
Selecting Row(s) Based Upon Derived Value Maximum
我需要显示一群人中关注最多的人。
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
结果table
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_id 和 id 是同一个键。
这个table继续,CNT是推导的(或计算的值),如何只显示包含CNT最大值的行(对于具有最大值的N条记录,所以LIMIT将不够)我已经尝试了各种连接和不同的条件,但没有任何进展。
在MySQL 8+之前的版本中,我们可以使用子查询:
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;
我需要显示一群人中关注最多的人。
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
结果table
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_id 和 id 是同一个键。
这个table继续,CNT是推导的(或计算的值),如何只显示包含CNT最大值的行(对于具有最大值的N条记录,所以LIMIT将不够)我已经尝试了各种连接和不同的条件,但没有任何进展。
在MySQL 8+之前的版本中,我们可以使用子查询:
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;