mysql 如何为每个条件选择一行

qni6mghb  于 2022-12-17  发布在  Mysql
关注(0)|答案(1)|浏览(185)

Input data
| npost_id|中|喜欢计数|
| - ------|- ------|- ------|
| 七|t4|三个|
| 二十一|t11|第二章|
| 三十|t16|第二章|
| 三十一|t16|第二章|
| 三十二|t18|第二章|
我想要每个人收到最多喜欢的post_id。
我只需要选择满足以下几个条件的一行:最大值(like_count),每1个id(可以重复),npost_id(主键)
以下是我的尝试:

SELECT npost_id, mid, like_count 
FROM feed
WHERE (mid, like_count) IN (SELECT mid, MAX(like_count) 
                            FROM feed
                            GROUP BY mid)

除了这个问题,我想不出其他任何问题。

jw5wzhpr

jw5wzhpr1#

在MySQL 8.0中,一个为〈mid,like_count〉的每个组合只检索一行的选项是使用ROW_NUMBER窗口函数,它允许您为〈mid,like_count〉的每个组合分配一个排名值(一个分区)。为了每个分区只得到一个元素,过滤掉排名大于1的行就足够了(具有重复〈mid,like_count〉值的行)。

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY mid, like_count ORDER BY npost_id) AS rn
    FROM tab
)
SELECT npost_id, mid, like_count
FROM cte
WHERE rn = 1

检查here演示。
在MySQL 5.7中,您可以使用〈mid,like_count〉的两种不同组合进行聚合,并为npost_id字段取较小的值(假设您愿意接受分区的任何npost_id值)。

SELECT MIN(npost_id) AS npost_id, 
       mid, 
       like_count
FROM tab
GROUP BY mid, like_count

查看here演示。

相关问题