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外键在组中使用主键或类似的东西?
您应该使用按主键分组的 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