> mysql:从每个组中提取最终记录
本指南探讨了用于检索MySQL数据库中每个组中最后一个记录的有效方法。 我们将研究适合MySQL 8.0和更早版本的技术。
mysql 8.0和窗口函数:
代表时间顺序):ROW_NUMBER()
id
此查询通过id
>(分组列)的数据分区,并将等级1分配给每个分区中的最后一个记录。
<code class="language-sql">WITH ranked_messages AS ( SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn FROM messages AS m ) SELECT * FROM ranked_messages WHERE rn = 1;</code>
pre-mysql 8.0技术:name
对于8.0之前的MySQL版本,需要替代策略。
方法1:与组的子查询:
>
方法2:左连接null滤波:> 此方法使用A将每个记录与同一组中的其他记录进行比较。 没有后续记录的记录(在联盟中由A
表示)表示组中的最后一个记录:
<code class="language-sql">SELECT * FROM (SELECT * FROM messages ORDER BY id DESC) AS x GROUP BY name</code>
性能分析: 这些方法的性能取决于数据大小和数据库配置。虽然窗口功能通常是有效的,但
方法通常比>子查询,尤其是对于大型数据集的表现。 在实质数据集(例如,2009年8月数据库)上的基准测试显示了LEFT JOIN
的方法要快得多。NULL
>
<code class="language-sql">SELECT m1.* FROM messages m1 LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id) WHERE m2.id IS NULL;</code>
MySQL 8.0的窗口功能提供了一种优雅且经常有效的解决方案。对于较旧的MySQL版本,>方法提供了一种坚固且经常更快的替代方案,尤其是在处理大桌子时。 最佳方法取决于您的特定MySQL版本和数据集大小。>
以上是MySQL如何高效检索每组的最后一条记录?的详细内容。更多信息请关注PHP中文网其他相关文章!