2017-05-26 10 views
0

order by節の後にサブセレクトクエリーでデータセットを動的に並べ替える必要があります。私はこのことに慣れ親しむために、小さなテストセットを作り、どちらもうまくいきませんでした。サブセレクションによるMySQLのオーダー

結果を直接表示するには、存在しない列で並べ替えてエラーを生成しようとします。これは私のクエリとその結果です:

select * from entries order by 2 desc, (select case when (1=1) then 4 else 5 end); 
select * from entries order by 2 desc, (select if(1=1,4,5)); 
+----+------+---------+------+ 
| id | name | content | time | 
+----+------+---------+------+ 
| 19 | ccc | ccc  | 300 | 
| 18 | bbb | bbb  | 200 | 
| 17 | aaa | aaa  | 100 | 
| 20 | aaa | aaa  | 400 | 
| 21 | aaa | aaa  | 50 | 
+----+------+---------+------+ 

1 = 1から1 = 2に切り替えることは決して結果を変更しません。私は1 = 2のエラーを期待しましたが、何も起こりませんでした。この形式の場合でも、両方のクエリは4列目とする必要があります。

私はそれは次のようになりますので、データセットは前後列によって順序付けられていることを期待:

+----+------+---------+------+ 
| id | name | content | time | 
+----+------+---------+------+ 
| 19 | ccc | ccc  | 300 | 
| 18 | bbb | bbb  | 200 | 
| 21 | aaa | aaa  | 50 | 
| 17 | aaa | aaa  | 100 | 
| 20 | aaa | aaa  | 400 | 
+----+------+---------+------+ 
+0

期待される出力は何ですか? –

+0

5番目の列でソートしたいが、4つしかない。あなたが念頭に置いている第5列は何ですか? –

+0

あなたの例はあまり役に立たない。それは単純に '2 desc、4'または' order by id desc、time'です。 –

答えて

1

あなたは本当にorder byのための位置の構文を使用しないでください - 私もそれはANSIで推奨されていませんだと思います標準。整数は、それ自身で、位置によって列を表します。しかし、数値のある式では、値は単なる数値です。 caseselectを持っている理由はありません

order by name desc, 
     (case when (1=1) then time else ?? end) 

だから、明示的に列名が含まれています。

+0

私は位置構文がうまくないと知っていますが、私のcontectでは私は他の選択肢がありません。列名を使用すると、それが動作します。不幸なことに、未知の列名を使用するとエラーが発生します。私はそれによって、両方の選択肢が与えられたテーブルに存在しなければならないと仮定します。 – JRsz

+0

'case'ステートメントでは、数値は列位置ではない数値です。 –

関連する問題