0

学生の名前を含むテーブルがあり、レコードは自動増加NRしますが、レコードを編集するたびNRに、IDフィールドにコピーする新しいテーブルが作成されます。しかし、MAX( ) のときに ID レコードをグループ化しようとすると、NRその ID の最大数が表示されますが、残りの rocord を要求すると、その ID グループの最後のレコードが表示されません。

SELECT MAX(`NR`) AS 'mNr',`NR`,`ID`,`Name1`,`Name3`,`Gender`
  FROM `Kids`  GROUP BY `ID`

これにより、次のような結果が得られます。

mNr NR ID 名前1 名前3 性別
252 1 1 アリス・カーパー f
179 2 2 ドラ・フィッシャー f
189 3 3 レイチェル キング f
173 4 4 フランク・スミス m
192 5 5 パトリック・フェイ m
305 6 6 グロリア・シング f
299 7 7 ブリジット・ヤング f

しかし、ご覧のとおり、クエリは最高の編集 NR を示していますが、その最新の NR に属するレコードの詳細ではなく、レコードの残りの最低を引き続き提供しています...私は何を間違っていますか? これはサンプルデータです:

NR  ID  Name1   Name3   Gender
1   1   Alice   Achand  f
2   2   Dorah   Achieng f
3   3   Racheal Achieng f
4   4   Francisca   Adikin  f
5   5   Patrick Adilu   m
6   6   Gloria  Ajwang  f
7   7   Bridget Aketch  f
130 5   Patrick Adilu   m
129 4   Francisca   Adikin  f
128 2   Dorah   Achieng f
153 4   Francisca   Adikin  f
173 4   Francisca   Adikin  f
179 2   Dorah   Achieng f
189 3   Racheal Achieng f
192 5   Patrick Adilu   m
252 1   Alice   Wor f
299 7   Bridget Aketch  f
305 6   Gloria  Ajwang  f
4

2 に答える 2

0

知らないうちに、MySQL の難解な機能を使用している可能性があります。MySQL では、集計関数または句に含まselectれていない集計クエリのステートメントに列を含めることができます。group byエンジンは、これらの列に任意の値を挿入します。

あなたが望むことをする正しい方法は、結合を使うことです:

SELECT k.*
FROM `Kids` k join
     (select id, max(nr) as maxnr
      from kids
      group by id
     ) m
     on k.id = m.id and nr = maxnr;

ドキュメントの明示的な説明は次のとおりです。

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。これは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットの並べ替えは、値が選択された後に行われます。ORDER BY は、サーバーが選択する各グループ内の値には影響しません。

詳細については、こちらを参照してください。

于 2013-11-03T16:47:37.493 に答える