MySQL - 从 GROUP BY 获取最大 ID 并保持性能

     2023-02-16     239

关键词:

【中文标题】MySQL - 从 GROUP BY 获取最大 ID 并保持性能【英文标题】:MySQL - Getting max ID from GROUP BY and maintaining performance 【发布时间】:2020-10-11 02:01:47 【问题描述】:

我有 3 张桌子:

帖子、主题和子论坛。

一个子论坛有很多线程, 一个 Thread 有很多 Posts。

我正在尝试检索每个子论坛中的最新(目前最大 ID)帖子。

这是我迄今为止尝试过的:

SELECT 
    p1.id,
    p1.thread_id,
    Subforums.id as subforum_id
FROM Posts p1 LEFT JOIN Posts p2
    ON (p1.thread_id = p2.thread_id AND p1.id < p2.id)
LEFT JOIN Threads
    ON p1.thread_id = Threads.id 
    AND p2.thread_id = Threads.id
LEFT JOIN Subforums 
    ON Threads.subforum_id = Subforums.id
WHERE p2.id IS NULL

它给了我一张这样的表格:

id | thread_id | subforum_id
12 | 1         | 4
...

我知道我可以使用 MAX 和 GROUP BY 语句的组合来获得每个 subforum_id 的最大值 id,但这看起来根本没有性能。

有没有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

您的代码看起来像是会对 Posts 表进行全表扫描,因此是的,性能不佳。 Felipe Zavan 的解决方案看起来更好,但与您正在寻找的结果不完整。假设 id 是 Posts 的主键,那么它将被索引,我会这样做

SELECT 
p1.id,
p1.thread_id,
Subforums.id as subforum_id
FROM (select thread_id, max(id) as id from Posts group by thread_id) as p1
LEFT JOIN Threads
    ON p1.thread_id = Threads.id 
LEFT JOIN Subforums 
    ON Threads.subforum_id = Subforums.id

【讨论】:

【参考方案2】:

您可以尝试按Post.id DESCLIMIT 排序的子查询到 1 个结果:

SELECT 
  s.id as subforum_id, 
  (
    SELECT 
      p.id 
    FROM 
      Posts p 
      LEFT JOIN Threads t ON p.thread_id = t.id 
    WHERE 
      s.id = t.subforum_id 
    ORDER BY 
      p.id DESC 
    LIMIT 
      1
  ) AS latest_post_id 
FROM 
  Subforums s;

Live example

【讨论】:

从 GROUP BY 中获取 MAX

】从GROUPBY中获取MAX【英文标题】:GetMAXfromaGROUPBY【发布时间】:2013-01-0301:21:28【问题描述】:当我遇到这种情况时,我正在练习一些SQL。我想看看某种商品出现了多少次,然后从那里得到出现最多的商品。这显示了每种商品出... 查看详情

查询 mysql group by 并拥有

...2021-11-1521:54:52【问题描述】:我正在准备创建一个查询以获取所有商业日期。我需要这个回报:商业1-3商业2-4商业5-2...但我需要从当前日期获取日期。我正在处理这个:selectcount(id)fromcitagroupbyid_comercialhavingdate(\'created_at\') 查看详情

MySQL order by before group by

...继续,如果可以的话,使用他们的例子。本例中的任务是获取数据库中每个作者的最新帖子。示例查询产生不可用的结果,因为它并不总是返回的最新帖子。SELECTwp_posts.*FROMwp_postsWHEREwp_p 查看详情

MySQL order by before group by

...继续,如果可以的话,使用他们的例子。本例中的任务是获取数据库中每个作者的最新帖子。示例查询产生不可用的结果,因为它并不总是返回的最新帖子。SELECTwp_posts.*FROMwp_postsWHEREwp_p 查看详情

使用 MySQL 通过 JOIN 获取 GROUP BY 中的 SUM

】使用MySQL通过JOIN获取GROUPBY中的SUM【英文标题】:GetSUMinGROUPBYwithJOINusingMySQL【发布时间】:2011-03-2006:00:09【问题描述】:我在MySQL5.1.38中有两个表。products+----+------------+-------+------------+|id|name|price|department|+----+------------+-------+ 查看详情

MySQL Query - 使用 group-by 时获取丢失的记录

】MySQLQuery-使用group-by时获取丢失的记录【英文标题】:MySQLQuery-gettingmissingrecordswhenusinggroup-by【发布时间】:2010-09-3021:05:20【问题描述】:我有一个问题:selectscore,count(1)as\'NumStudents\'fromtestresultswheretestid=\'mytestid\'groupbyscoreorderby 查看详情

使用 MYSQL Group By 获取最受欢迎的值

】使用MYSQLGroupBy获取最受欢迎的值【英文标题】:usingMYSQLGroupBytogetthemostpopularvalue【发布时间】:2021-10-1812:13:38【问题描述】:我正在使用https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_func_mysql_concat练习MYSQL,它有一个模拟数据... 查看详情

模拟 group by,order by,从 mysql 到 ms sql 2000 的限制

】模拟groupby,orderby,从mysql到mssql2000的限制【英文标题】:Emulategroupby,orderby,limitfrommysqltomssql2000【发布时间】:2011-12-1514:46:35【问题描述】:我在MySQL中有一个查询:selectslscod,slsname,brcfromtd_casagroupbyslscodorderbyslsnamelimit0,100此查询... 查看详情

MySQL SELECT 从多个表,多个 GROUP BY 和 group_concat?

】MySQLSELECT从多个表,多个GROUPBY和group_concat?【英文标题】:MySQLSELECTfrommultipletables,multipleGROUPBYandgroup_concat?【发布时间】:2012-07-1001:05:56【问题描述】:我想在MySQ中查询三个表。如下:**Table:Leaderboard**Name|Score------------James|1Steve... 查看详情

MySQL 查询:GROUP BY - 获取特定行(不总是第一行)

】MySQL查询:GROUPBY-获取特定行(不总是第一行)【英文标题】:MySQLquery:GROUPBY-getspecificrow(notalwaysthefirstone)【发布时间】:2012-06-0207:39:58【问题描述】:带有示例数据的表格“图像”:id|user_id|album_id|sort115112151231510415205152161530MySQ... 查看详情

从 group by 获取列描述

】从groupby获取列描述【英文标题】:Getcolumnsdescribefromgroupby【发布时间】:2017-03-0312:40:41【问题描述】:我对从Pandas的数据集按组获取数据描述很感兴趣。这些数据是指不同人的假期。此外,访问过的地方的数量存储在该城市。... 查看详情

如何在多列中使用 MYSQL GROUP BY SUM

...5-02-1323:33:35【问题描述】:基本上,问题是如何从#hours中获取总和,按#id、#code、#semester、#year列分组id,hours,code,semester,year165,6,3,1,2012166,6,16,1,2012460,8,14 查看详情

从 GROUP BY 中获取具有 NULL 列的行

】从GROUPBY中获取具有NULL列的行【英文标题】:GettherowwithaNULLcolumnfromGROUPBY【发布时间】:2021-12-3105:45:52【问题描述】:如何从下面的查询中获取address_1中具有null值的行。SELECTid,address_1,address_2,address_3FROMtableGROUPBYaddress_2,address_3HAV... 查看详情

从 MySQL 中的每个 'group by' 类别中检索任意数量的随机行

】从MySQL中的每个\\\'groupby\\\'类别中检索任意数量的随机行【英文标题】:Retrieveanarbitrarynumberofrandomrowsfromeach\'groupby\'categoryinMySQL从MySQL中的每个\'groupby\'类别中检索任意数量的随机行【发布时间】:2012-12-0217:16:15【问题描述】:... 查看详情

将使用 GROUP BY 的查询从 MySQL 转换为 Postgres 和 SQLite

】将使用GROUPBY的查询从MySQL转换为Postgres和SQLite【英文标题】:TranslatequerywithGROUPBYfromMySQLtoPostgresandSQLite【发布时间】:2016-04-0711:24:33【问题描述】:在MySQL中,我使用了很多如下所示的结构:LEFTJOIN(SELECTfield_one,field_two,field_threeFR... 查看详情

在 mysql 中使用 group by 查询和 order by 查询选择

...:04【问题描述】:嗨,我有一个数据库,我使用此查询来获取最新记录,使用groupby和orderby我已使用此代码获取所有记录SELECTid,timeFROMeventlogWHEREevent=\'2\'ORDERBY`eve 查看详情

SQL — 从 GROUP BY 中获取前 3 个值

】SQL—从GROUPBY中获取前3个值【英文标题】:SQL—takeTop3valuesfromGROUPBY【发布时间】:2020-11-0408:21:37【问题描述】:小提琴:https://www.db-fiddle.com/f/9F7XPiGtuQAYXQ99HfNJGN/3CREATETABLEtable_1(`country`VARCHAR(2),`category`VARCHAR(2),`cnt`INT);INSERT 查看详情

php mysql Group By获取最新记录,而不是第一条记录

】phpmysqlGroupBy获取最新记录,而不是第一条记录【英文标题】:phpmysqlGroupBytogetlatestrecord,notfirstrecord【发布时间】:2012-11-1918:04:10【问题描述】:桌子:(`post_id`,`forum_id`,`topic_id`,`post_time`)(79,8,4,\'2012-11-1906:58:08\');(80,3,3,\'2012-11-1906: 查看详情