GROUP BY外键还是主键?

Pra*_*dra 5 php mysql sql group-by primary-key

我有两张桌子:

user
=======
id
name
class

marks
=======
id
user_id
sub_id
mark
Run Code Online (Sandbox Code Playgroud)

用户表包含用户(学生)标记表的详细信息表包含具有主题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)
Run Code Online (Sandbox Code Playgroud)

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

是否有任何规则表明你应该使用OR中的OR外键在组中使用主键或类似的东西?

noz*_*noz 6

鉴于您已经完成了左连接,您应该使用第二个查询作为marks.user_id可以为null


Kár*_*agy 3

您应该使用按主键分组的 2 版本。一般来说,最好基于主表的列而不是连接的列进行排序和分组。如果你对连接的表列进行排序或分组,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;
Run Code Online (Sandbox Code Playgroud)

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