5

私は2つのテーブルを持っています:

user
=======
id
name
class

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

ユーザー テーブルには、ユーザー (学生) のマークの詳細が含まれます テーブルには、科目 ID を持つさまざまな科目の学生のマークが含まれます

これらのテーブルから名前、クラス、合計点を取得したいと考えています。

2 つのクエリがあります。

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)

どちらも必要なデータを提供してくれます。私の質問は、どちらを使用すればよいですか?

グループで主キーを使用するか、グループで外部キーを使用するか、またはそのようなものを使用する必要があるというルールはありますか?

4

5 に答える 5

7

左結合を行った場合は、marks.user_id が null になる可能性があるため、2 番目のクエリを使用する必要があります。

于 2013-07-22T09:43:49.793 に答える
3

主キーによる 2 つのバージョンのグループ化を使用する必要があります。一般に、結合されたテーブルではなく、メイン テーブルの列に基づいて order および group by ステートメントを使用することをお勧めします。結合されたテーブル列で順序付けまたはグループ化を行う場合、MySQL は一時テーブルを作成する必要があり、データサイズに基づいて簡単にディスクに移動し、重大なパフォーマンスのボトルネックになる可能性があります。

2 つのクエリに対して次の Explain を実行して、私が何を話しているかを確認してください。

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

于 2013-07-22T09:50:49.110 に答える
1

次のSQLを実行したとき:

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

MySQLは、ユーザーテーブルにファイルソートを使用し、テーブルにキーが使用されていないことを示しており、次を実行したとき:

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

現在、MySQL は、(filesort を使用する代わりに) 両方のテーブルにキーを使用すると述べています。したがって、ファイルソートはパフォーマンスを低下させる可能性があるため、2番目の方法を推奨する必要があると思います。

于 2013-07-22T10:06:28.617 に答える