データの各グループの最新の作品でのMySQLのクエリ

開発は、多くの場合、そのようなこのテーブルの下など、最新のデータパケットの問い合わせを、(各アドレスが最新のレコードを照会)に遭遇します:

次のようにSQL:

- ---------------------------- 
- 試験表構造
- ------------ ---------------- 
DROP  TABLE  IFは EXISTS `test`を。
CREATE  TABLEを`test`(
  ` id`のINT11NOT  NULL AUTO_INCREMENT、
  `NAME`のVARCHAR100CHARACTERの SET UTF8のCOLLATE utf8_general_ciのNULLの DEFAULTの NULL 
  ` address`のVARCHAR10CHARACTERの SETUTF8のCOLLATE utf8_general_ciのNULLの DEFAULTの NULL 
  `create_time` タイムスタンプ0NULLの DEFAULTの CURRENT_TIMESTAMP PRIMARY  KEY (` id`)BTREEを用いた
)ENGINE = InnoDBのAUTO_INCREMENT =  13  CHARACTERの SET  = UTF8のCOLLATE = utf8_general_ci ROW_FORMAT = 動的。

- ---------------------------- 
- テストの記録
- ------------- --------------- 
INSERT  INTO test` `VALUES1" 張1 ' ' 北京' ' 2019年9月10日11時22分23秒' );
 INSERT  INTO ` test` VALUES2' ジョン・ドウ2 ' ' 北京' ' 2019- 12時22分23秒09-10 ' );
 INSERT  INTOは `test` 値を3' 張3 ' ' 北京' ' 2019年9月5日12時22分23秒' );
 INSERT  INTOは `test` VALUES4' ジョン・ドウ4 ' ' 北京' ' 2019年9月6日12時22分23秒' );
 INSERT  INTO test`` の値を5' ジョン・ドウ1 '' 上海'' 2019年9月6日12時22分23秒' );
 INSERT  INTO `test` VALUES図6' ジョン・ドウ2 ''上海' ' 2019年9月7日12時22分23秒' );
 INSERT  INTOは `test` 図7' ジョン・ドウ3 ' ' 上海' ' 2019年9月11日12時22分23秒)。
 INSERT  INTO test` ` VALUES8。 ' ジョン・ドウ4 '' 上海'' 2019年9月12日12時22分23秒' );
 INSERT  INTO test`` VALUES9' キング1 '' 広州'' 2019年9月3日午前12時22分23秒' );
 INSERT  INTO test` ` VALUES10' キング2 '' 広州'' 2019年9月4日12時22分23秒' );
 INSERT  INTOは `test` VALUES11' 王3 ' ' 広州' ' 2019年9月5日12時22分23秒)。

 私たちは通常、次のように各アドレスの最新のレコードを、SQLのためにグループ化される時系列フラッシュバックで配置されます。

SELECT  *  FROMSELECT  *  FROMテストORDER  BY CREATE_TIMEのDESCGROUP  BYアドレス

しかし、結果は、我々が望むものではありません。

 

 

 実行時間のフラッシュバックの結果に応じて配置されました:

 

だから、結果は本当に上記のクエリのGETは1/5/9で、2/8/11であるレコードIDを取得したい、これはなぜですか?

そのためmysql5.7で、ソートされたサブクエリは、使用の結果として、メインクエリのサブクエリのほとんどは、サブクエリが理由の並べ替えを必要としないためか、無効になっています。

それでは、どのように我々はそれを調査する必要があり、2つの方法があります。

最初:

SELECT  *  FROMSELECT  *  FROMテストORDER  BY CREATE_TIMEのDESCの LIMIT 10000GROUP  BYアドレス

結果は以下のとおりです。

この種では、それが有効になるので、子供だけでソートクエリ、しかし、唯一の大きな可能性の数を制限するように設定することができないように、サブクエリの制限の制限をソート

第二:

SELECTトン。*  FROMSELECTアドレス、マックス(CREATE_TIME)のよう CREATE_TIME FROM試験GROUP  BYアドレス)LEFT  JOINテストTをON t.address = a.address  t.create_time = a.create_time

そして、MAX関数を介して(アドレスパケットに応じて、必要に応じて)、続いてテーブルによって、元データとしてクエリに関連する最新の時刻を取得するためにアドレス

条件とそれに対応し、最大時間とアドレスを取得する時間は、結果は、同じです:

 

 効率は、何の比較を継続、ありません...

 

おすすめ

転載: www.cnblogs.com/java-spring/p/11498457.html