ユニオン内でソート済み

ユニオン内でソートする機能。

ありがとうfuncaポストを残します-誰かが役に立つかもしれません 主な意味-「 中間データではなく、結果をソートする必要があります 。」

  1. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  2. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  3. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  4. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  5. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  6. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  7. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;



  8. CREATE TABLE `t1` ( `id1` int ( 10 ) unsigned NOT NULL default '0' , `id2` int ( 10 ) unsigned NOT NULL , `k1` decimal ( 6, 5 ) unsigned NOT NULL default '0.00000' , `k2` int ( 10 ) unsigned NOT NULL default '0' , PRIMARY KEY ( `id1` , `id2` ) , KEY `k2` ( `id1` , `k2` ) ) ENGINE = MEMORY;







エンジンのメモリはキーではありません-MyISAMで同じことを確認しました



次に、次のようなデータを入力します。





  1. for$ i = 0; $ i <100; $ i ++){
  2. $ i- > query( 'REPLACE INTO `t1`(` id1`、 `id2`、` k1`、 `k2`)VALUES(?d ,? d ,? f ,? d)'
  3. rand(0,99999)、rand(0,5)、rand(2,99999)/ 50,000、rand(0,20)
  4. );
  5. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




そして、そのようなクエリの結果を見てください:



  1. SELECT `id1`、` k1`、 `k2`
  2. `t1`から
  3. WHERE `id2` = 3 AND` k2` = 13
  4. ORDER BY `k1` DESC
  5. UNION
  6. SELECT `id1`、` k1`、 `k2`
  7. `k1`から
  8. WHERE `id2` = 3 AND` k2`!= 13
  9. ORDER BY `k1` DESC




ここに、上の例の場合:

 id1 k1 k2

 2726 1.50194 13
 88207 0.25084 13
 37274 0.96550 11
 11059 0.42600 6
 11139 1.90196 4
 63593 1.42970 5
 65273 1.44950 18
 28721 0.79328 15
 70946 0.87576 4
 96673 1.71290 14
 49207 1.92928 17
 40697 1.82320 18




私たちの意見のバグは、ユニオンの2番目のクエリによって生成されたサンプルでは、​​中央の列による並べ替えがないことです。

habrasocietyのいずれかがそのような行動に光を当てることができますか



ところで、もちろん、この問題の解決策も共有したいと思います。

  1. SELECT `id1`、` k1`、 `k2`
  2. `t1`から
  3. WHERE `id2` = 3
  4. ORDER BY if ( `k2` = 13、0、1)、` k1` DESC




 2726 1.50194 13
 88207 0.25084 13
 49207 1.92928 17
 11139 1.90196 4
 40697 1.82320 18
 96673 1.71290 14
 65273 1.44950 18
 63593 1.42970 5
 37274 0.96550 11
 70946 0.87576 4
 28721 0.79328 15
 11059 0.42600 6



All Articles