当前位置: 首页 > 知识库问答 >
问题:

按外键分组还是按主键分组?

郎弘业
2023-03-14

我有两张桌子:

user
=======
id
name
class

marks
=======
id
user_id
sub_id
mark

用户表包含用户(学生)分数的详细信息表包含具有科目id的不同科目的学生分数

我想从这些表中获取名称、类和总分。

我有两个问题:

1. SELECT name, class, SUM(mark) AS total FROM user
   LEFT JOIN marks ON marks.user_id = user.id
   GROUP BY marks.user_id
   ///Here in GROUP BY I have used foreign key (marks.user_id)

2. SELECT name, class, SUM(mark) AS total FROM user
   LEFT JOIN marks ON marks.user_id = user.id
   GROUP BY user.id
   ///Here in GROUP BY I have used primary key (user.id)

两者都给了我所需的数据。我的问题是我应该使用哪一个?

有什么规则说你应该在group by OR中使用主键或外键吗?

共有3个答案

柴英博
2023-03-14

实际上,我建议您使用第二个索引,因为主键索引和任何其他重复索引之间的性能略有差异。对该表最常见的查询很可能是找出某个用户是否处于某个标记中,并且该查询将快速执行,除非有标记。用户id可以为空。

宋华美
2023-03-14

您应该按主键使用2版本分组。一般来说,最好基于主表的列而不是联接的列使用order和GROUPBY语句。如果您在连接的表列上按顺序或分组,MySQL必须创建基于您的数据大小的临时表,这些临时表很容易进入磁盘,并最终导致严重的性能瓶颈。

对这两个查询运行以下解释,看看我在说什么:

EXPLAIN SELECT name, SUM(mark) AS total FROM users
   LEFT JOIN marks ON marks.user_id = users.id
   GROUP BY marks.user_id;

EXPLAIN SELECT name, SUM(mark) AS total FROM users
   LEFT JOIN marks ON marks.user_id = users.id
   GROUP BY users.id;

同样可以在这里找到:http://sqlfiddle.com/#!2/a8ece/6

安明亮
2023-03-14

如果你已经做了左连接,你应该使用第二个查询作为标记。用户\u id可能为空

 类似资料:
  • 这将产生以下结果 我所感兴趣的实际上只是上面结果中的列表,我希望理想地将其作为groupby操作的一部分来完成。我知道这是可以做到的,例如,通过循环结果映射结构。但是有没有一种方法可以使用流来实现它呢?

  • 问题内容: 一个表的外键是否可以成为另一个表的组合主键的一部分?例如,如果我有两个表,一个包含有关不同用户的所有活动项目的信息,另一个包含有关项目正在使用哪种设备的信息: 项目表: (两者都不是唯一的) 设备表: (两者都不是唯一的) 现在可以将设备表中的ProjectId设置为项目表中的外键吗?尝试时,我收到一条错误消息,指出“项目表”中的列与现有的主键或唯一约束不匹配? 问题答案: 不。 创建

  • 我有一个带有自动增量主键列和datetime列的表。我想返回按创建日期排序的行。 我按日期或主键订购有关系吗?我想这是一个更快的by主键,而不是日期格式或时间戳。新记录将具有更大的主键。然而,每个人都按日期字段排序。

  • 问题内容: 我有一个看起来与此类似的表: 我该如何在Postgres中编写查询以仅返回按表中每个唯一字符分组的最新(按)行? 问题答案: 用途:

  • 问题内容: 我必须与Hibernate合作,但我不确定如何解决此问题,我有2个具有1..n关系的表,如下所示: 如何使用Hibernate进行管理? 我不知道如何声明将包含主键一部分的外键。 我的数据库架构是从Hibernate模型生成的。 问题答案: 我找到了解决此问题的两种方法。 第一个是一种解决方法,没有第二个那么整洁。 将实体的主键定义为包含,和的复合键,首先将假定为主键的内容定义为唯一约

  • 我试图使用Spark主机在EC2上使用本指南对常见爬网数据执行简单转换,我的代码如下所示:

  • 我需要按键值保留输入xml分组中的最新条目。可以用xsl 2.0实现吗?输入

  • 问题内容: 是否可以从元组中获取价值: 通过像这样调用STR键 Python说只有int可以用于这种类型的“查询” 我不能使用循环(太多的开销…) 谢谢! 问题答案: 此类查询的规范数据结构是字典: 如果使用元组,则无法避免循环(显式或隐式)。