開発は、多くの場合、そのようなこのテーブルの下など、最新のデータパケットの問い合わせを、(各アドレスが最新のレコードを照会)に遭遇します:
次のようにSQL:
- ---------------------------- - 試験表構造 - ------------ ---------------- DROP TABLE IFは EXISTS `test`を。 CREATE TABLEを`test`( ` id`のINT(11)NOT NULL AUTO_INCREMENT、 `NAME`のVARCHAR(100)CHARACTERの SET UTF8のCOLLATE utf8_general_ciのNULLの DEFAULTの NULL 、 ` address`のVARCHAR(10)CHARACTERの SETUTF8のCOLLATE utf8_general_ciのNULLの DEFAULTの NULL 、 `create_time` タイムスタンプ(0)NULLの DEFAULTの CURRENT_TIMESTAMP 、 PRIMARY KEY (` id`)BTREEを用いた )ENGINE = InnoDBのAUTO_INCREMENT = 13 CHARACTERの SET = UTF8のCOLLATE = utf8_general_ci ROW_FORMAT = 動的。 - ---------------------------- - テストの記録 - ------------- --------------- INSERT INTO test` `VALUES(1、" 張1 ' ' 北京' ' 2019年9月10日11時22分23秒' ); INSERT INTO ` test` VALUES(2、' ジョン・ドウ2 ' ' 北京' ' 2019- 12時22分23秒09-10 ' ); INSERT INTOは `test` 値を(3、' 張3 ' ' 北京' ' 2019年9月5日12時22分23秒' ); INSERT INTOは `test` VALUES(4、' ジョン・ドウ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` ` VALUES(8。 、' ジョン・ドウ4 '、' 上海'、' 2019年9月12日12時22分23秒' ); INSERT INTO test`` VALUES(9、' キング1 '、' 広州'、' 2019年9月3日午前12時22分23秒' ); INSERT INTO test` ` VALUES(10、' キング2 '、' 広州'、' 2019年9月4日12時22分23秒' ); INSERT INTOは `test` VALUES(11、' 王3 ' ' 広州' ' 2019年9月5日12時22分23秒」)。
私たちは通常、次のように各アドレスの最新のレコードを、SQLのためにグループ化される時系列フラッシュバックで配置されます。
SELECT * FROM(SELECT * FROMテストORDER BY CREATE_TIMEのDESC)GROUP BYアドレス
しかし、結果は、我々が望むものではありません。
実行時間のフラッシュバックの結果に応じて配置されました:
だから、結果は本当に上記のクエリのGETは1/5/9で、2/8/11であるレコードIDを取得したい、これはなぜですか?
そのためmysql5.7で、ソートされたサブクエリは、使用の結果として、メインクエリのサブクエリのほとんどは、サブクエリが理由の並べ替えを必要としないためか、無効になっています。
それでは、どのように我々はそれを調査する必要があり、2つの方法があります。
最初:
SELECT * FROM(SELECT * FROMテストORDER BY CREATE_TIMEのDESCの LIMIT 10000)GROUP BYアドレス
結果は以下のとおりです。
この種では、それが有効になるので、子供だけでソートクエリ、しかし、唯一の大きな可能性の数を制限するように設定することができないように、サブクエリの制限の制限をソート
第二:
SELECTトン。* FROM(SELECTアドレス、マックス(CREATE_TIME)のよう CREATE_TIME FROM試験GROUP BYアドレス)LEFT JOINテストTをON t.address = a.address と t.create_time = a.create_time
そして、MAX関数を介して(アドレスパケットに応じて、必要に応じて)、続いてテーブルによって、元データとしてクエリに関連する最新の時刻を取得するためにアドレス
条件とそれに対応し、最大時間とアドレスを取得する時間は、結果は、同じです:
効率は、何の比較を継続、ありません...