MySQL-从GROUP BY获取最大ID并维护性能

MySQL-从GROUP BY获取最大ID并维护性能,mysql,group-by,query-optimization,greatest-n-per-group,Mysql,Group By,Query Optimization,Greatest N Per Group,我有三张桌子: Post、线程和子论坛 子窗体有许多线程, 一个线程有很多帖子 我正在尝试检索每个子论坛中最新的max ID 这就是我迄今为止所尝试的: 选择 p1.id, p1.U螺纹id, 子论坛.id作为子论坛\u id 从立柱p1向左连接立柱p2 在p1.thread_id=p2.thread_id和p1.id

我有三张桌子:

Post、线程和子论坛

子窗体有许多线程, 一个线程有很多帖子

我正在尝试检索每个子论坛中最新的max ID

这就是我迄今为止所尝试的:

选择 p1.id, p1.U螺纹id, 子论坛.id作为子论坛\u id 从立柱p1向左连接立柱p2 在p1.thread_id=p2.thread_id和p1.id
id | thread_id | subforum_id
12 | 1         | 4
...
我知道我可以使用MAX和GROUP BY语句的组合来获得每个子论坛的MAX id,但这看起来根本没有性能


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

您可以尝试一个子查询,该子查询按Post.id DESC排序并限制为1个结果:

选择 s、 作为子论坛的id\u id, 选择 p、 身份证 从…起 员额p 在p.thread_id=t.id上左连接线程t 哪里 s、 id=t.子论坛\u id 订购人 p、 id描述 限度 1. 作为最新的邮政id 从…起 子论坛;
您可以尝试按Post.id DESC排序并将结果限制为1的子查询:

选择 s、 作为子论坛的id\u id, 选择 p、 身份证 从…起 员额p 在p.thread_id=t.id上左连接线程t 哪里 s、 id=t.子论坛\u id 订购人 p、 id描述 限度 1. 作为最新的邮政id 从…起 子论坛;
您的代码看起来会对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

您的代码看起来会对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