LoginSignup
3
7

More than 5 years have passed since last update.

ソートしたクエリ同士をUnionしたくて泥沼だった話

Posted at

条件1でソートしたものと、条件2でソートしたものをユニオンで結合しようとしたらソートが効かずにどっぷりハマりました。

結論から書きますが、ユニオンは内部でソートしても効きません

しかし裏技がありました。

まずは想定ですが、人気の野球選手ベスト三位と、人気のサッカー選手ベスト三位をくっつけたテーブルを取得したいとします。

まずダメな例から書きます.

(select * from baseball_player order by vote DESC limit 3)
union
(select * from soccer_player order by vote DESC limit 3)

まんまとハマったやつです。
上のクエリも下のクエリも独立でなら正しい結果を吐きますが、ユニオン内部だとソートが効かないので、無意味です。

そこで裏技!!
結構よくあることなのですが、””テーブルに包む””とうまく行ったりします。
何を言ってるのかわからないと思うが俺にも(ry

select * from ((select * from baseball_player order by vote DESC limit 3)) tbl1
union
select * from ((select * from soccer_player order by vote DESC limit 3)) tbl2

なぜかこうするとユニオン内にも関わらずソートが効きます。

おそらく、テーブルに直すことで先にその中のクエリを作ってくれるんだと思います。
4 - 2 * 5 = -6

(4 - 2) * 5 = 10
に直すようなイメージで、ときどきこうしてテーブルに直すことがあります。

SQLの不具合基準ってよくわからないものが多いですよね。

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7