社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

fthiella

fthiella 最近创建的主题
fthiella 最近回复了
9 年前
回复了 fthiella 创建的主题 » 如何对多个表使用mysql group by和inner join限制记录数

你可以用 GROUP_CONCAT 聚合函数,将所有年份归为一列,按 id 并由 rate :

SELECT   id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM     yourtable
GROUP BY id

结果:

-----------------------------------------------------------
|  ID | GROUPED_YEAR                                      |
-----------------------------------------------------------
| p01 | 2006,2003,2008,2001,2007,2009,2002,2004,2005,2000 |
| p02 | 2001,2004,2002,2003,2000,2006,2007                |
-----------------------------------------------------------

然后你可以用 FIND_IN_SET ,它返回第一个参数在第二个参数中的位置。

SELECT FIND_IN_SET('2006', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
1

SELECT FIND_IN_SET('2009', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
6

结合使用 GROUP_CONCAT FIND_IN_SET ,并按find_in_set返回的位置进行筛选,然后可以使用此查询仅返回每个id的前5年:

SELECT
  yourtable.*
FROM
  yourtable INNER JOIN (
    SELECT
      id,
      GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
    FROM
      yourtable
    GROUP BY id) group_max
  ON yourtable.id = group_max.id
     AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5
ORDER BY
  yourtable.id, yourtable.year DESC;

请看小提琴 here .

请注意,如果有多行可以具有相同的费率,则应考虑在“费率”列而不是“年份”列上使用“组一致(按费率的不同费率顺序)”。

group_concat返回的字符串的最大长度是有限的,因此如果需要为每个组选择几条记录,则此操作很有效。