テーブルを行ごとに検索し、その後、両側の周囲の5行を返すMySqlクエリを作成するのに苦労しています。
問題は、行がアルファベット順に配置されており、idフィールドを使用できないことです。
基本的に重要なのは、アルファベット順に並べられた状態で、現在の行がちょうど真ん中にある11行を取得することです。
これはで本当に簡単union
です。これを試して:
(select t.* from t where t.col <= YOURNAME
order by t.col desc
limit 6
)
union all
(select t.* from t where t.col > YOURNAME
order by t.col
limit 5
)
order by t.col
クエリの最初の部分は、前の5つを返します。2番目は後の5を返します。
ちなみに、重複している場合は、代わりにこれが必要になる場合があります。
(select t.* from t where t.col = YOURNAME)
union all
(select t.* from t where t.col < YOURNAME
order by t.col desc
limit 5
)
union all
(select t.* from t where t.col > YOURNAME
order by t.col
limit 5
)
order by t.col
したがって、行の範囲を選択する場合は、IDに依存できないと言うので、row_numberを友達にする必要があります。の使用について、この広く受け入れられている詳細なSO回答mySQL ROW_NUMBER
を確認してください。
次に、この動作するSQLFiddleコードを試してください。ただし、行に値を設定することで必要な行数を回復するため、まだ少し調整していますWHERE tt.row_number between 3 and 7
が、これらの行は、何らかの理由で選択した行の周囲にはありません。トリッキーなこと。
テストデータ:
id col1
1 adfg
2 sg5r
3 34tdfgdf
4 ergdfd
5 ghjghghj
6 4gfhfrgfr
7 zxcxvfdf
8 sfdgd
9 s8545454
10 7jhgdfe45
11 fbvmso
12 sdfg9dj3
13 zjvjude89
14 _sdfdi3
クエリ:
SELECT Table1.*
FROM Table1
WHERE col1 IN (
SELECT col1
FROM (SELECT t.col1,
@curRow := @curRow + 1 AS row_number
FROM Table1 t
JOIN (SELECT @curRow := 0) r
) tt
WHERE tt.row_number between 3 and 7
)
ORDER BY col1;
結果データ:
ID COL1
3 34tdfgdf
6 4gfhfrgfr
4 ergdfd
5 ghjghghj
7 zxcxvfdf
テーブルにレコードが多すぎない場合は、一時テーブルを使用して解決できます。
create temporary table temp_yourtable(
id int auto_increment,
....,
primary key(id)
)
select ... from yourtable;
select t.* from temp_yourtable t, temp_yourtable t1
where t1.thealpabeticcolumn = your_key and t.id between t1.id - 5 and t1.id + 5
パラメータに基づいて、以下のようにしてみてください。
SELECT * FROM table WHERE id < 5 LIMIT 10
UNION
SELECT * FROM table WHERE id = 5
UNION
SELECT * FROM table WHERE id > 5 LIMIT 10;