一对多关系分页查询:如何高效处理关联对象作为查询条件?

这就是陷阱:分表设计中的外部连接分页查询性能较差,单表设计中的字段拼接违反了范式。

不信:LIKE模糊匹配查询准确率低,性能差。

不要这样做:直接使用 GROUP_CONCAT 和 EXISTS 子句来优化查询。

实用提醒:确保相关字段有索引,避免全表扫描。

聊聊MySql8.0中的group by 和 max函数取最新(优)一条记录的问题

记得有一次,我在处理学校成绩系统的数据库查询时,遇到了一个难题。
我们需要从成绩表中找出每个学生每门科目的最高分。
起初,我直接使用GROUP BY和MAX函数。
当结果出来的时候,我傻眼了。
显然有些科目的最高分并不是成绩最高的学生,而是其他学生。
我仔细查了资料,发现每个科目的成绩记录都是按照学号的顺序排列的,而且学号是自增的,所以默认的GROUP BY操作是按照学号排序的,而不是成绩。
我尝试手动调整学生ID的顺序,但是GROUP BY的结果还是一样。
我突然想到MySQL的GROUP BY默认是按照主键或者聚集索引的顺序取值。
我查了一下,发现如果表没有主键,GROUP BY会按照聚集索引的顺序取值。
这还不能解释为什么会出现这种情况吗? 我尝试使用_rowid查看隐藏的聚集索引ID,果然是学生ID。
最后我决定使用子查询来解决这个问题。
通过首先找到每个科目的最高分,然后将其与原始表格相关联,我终于得到了正确的结果。
这个过程让我深刻理解了MySQL中GROUP BY的默认行为,以及如何根据实际情况调整查询策略。
等等,还有一件事。
我突然想到,如果遇到没有聚集索引的表,我又会头疼了。