2011-12-03 5 views
6

のは、私がmessagesというテーブルから100件のレコードを取得したいとしましょう、と私は彼らに次のように取得したい:SQLでSELECTでマージすることはできますか?

1st message 
100th message 
2nd message 
99th message 
3rd message 
98th message 
(...) 

この効率的を行うにはどのような方法はありますか?適切なクエリは何でしょうか? または、最初の50を選択するクエリを作成し、最後の50を選択して結果をマージする必要がありますか?

+0

これは、私はおそらく2つのクエリを作成し、アプリケーションコードでそれらをマージします1ケースです。行番号を作成し、非常に巧妙な条件付きの「ORDER BY」を使用することで、おそらく1つのクエリで実行できますが、アプリケーションコードで行うほうがはるかに簡単です。 –

+0

ええ、私は同じと思った...おそらく2つの異なるクエリでそれを行い、その結果をコードにマージする方が簡単で効率的だ。 – federicot

+0

ここで誰かが巧妙な解決策を生み出すかどうかは間違いない。ここにはかなり賢い人々がいます。 –

答えて

2

あなたのIDは数字の並びであれば試してみてください。」すると

まず

SET @half = (SELECT MAX(id) FROM messages)/2; 

SELECT * FROM `messages` ORDER BY (IF(id<@half,@half*2-id,id-1)) DESC,id ASC; 
+0

は100の制限ですが、クエリの最後には 'LIMIT 100'となります。 –

+0

最後の' ASC 'は 'DESC'でなければなりません。それとは別に、これは完全に機能し、これらのすべての中で最も簡単なソリューションです。ありがとう! – federicot

+0

少し遅れて尋ねるのは遅いですが、もし 'id'によって順序付けするのではなく、' timestamp'( 'UNIX_TIMESTAMP(timestamp)'を使って)で注文していますか? – federicot

0

ポイントが2つの仮想列 "serie_order"(バリアント)を作成することであり、あなたのデータの両方の部分で使用する "serie"(定数)を使用します(データを2つに分割する必要があります)。

SELECT * FROM (
    SELECT 1 as serie, message_id AS serie_order , * FROM 
    (SELECT message_id FROM messages) as part_up 
UNION 
    SELECT 2 as serie, 101-message_id as serie_order, * FROM 
    (SELECT message_id FROM messages) as part_down 
) AS world 

ORDER BY serie_order ASC, serie ASC 
LIMIT 100 
+0

悲しいことに、MySQLには 'generate_series()'関数がありません。 – pilcrow

+0

これはちょうど仮想データとして使用されました。私はopメッセージ "テーブルを使って編集しました – 131

+0

これは正しいアイデアですが、あまり正しくありません。裸の "*"はSELECTで最初に来る必要があります。それ以外の場合は構文エラーです。それとは別に、「メッセージ」に、たとえば200行がある場合はどうなりますか?単純に 'SELECT 1 AS serie、message_id AS serie_order、message_id FROM messages'のように、最も内側に派生したテーブルは必要ありません。 – pilcrow

0
set @rank:=0; 

select id from 
(select id, @rank:=(coalesce(@rank, 0)+1) as new_order 
from a_table 
order by some_column limit 100) as ordering 
order by if (new_order<=50, new_order-1, abs(100-new_order)) asc; 
+1

ほぼ! "new_order" 1と "new_order" 100はどちらもORDER BY句で0になり、2と99は1になります。MySQLはどのレコードを最初に置くかをどのように知っていますか?適切な出力を保証するには、[この回答](http://stackoverflow.com/a/8371930/132382)のように、2番目のORDER BY基準が必要です。 – pilcrow

関連する問題