1

テーブルを行ごとに検索し、その後、両側の周囲の5行を返すMySqlクエリを作成するのに苦労しています。

問題は、行がアルファベット順に配置されており、idフィールドを使用できないことです。

基本的に重要なのは、アルファベット順に並べられた状態で、現在の行がちょうど真ん中にある11行を取得することです。

4

4 に答える 4

1

これはで本当に簡単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
于 2013-02-27T15:09:25.867 に答える
1

したがって、行の範囲を選択する場合は、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
于 2013-02-27T10:15:21.850 に答える
1

テーブルにレコードが多すぎない場合は、一時テーブルを使用して解決できます。

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
于 2013-02-27T10:21:47.730 に答える
-1

パラメータに基づいて、以下のようにしてみてください。

SELECT * FROM table WHERE id < 5 LIMIT 10
UNION
SELECT * FROM table WHERE id = 5
UNION
SELECT * FROM table WHERE id > 5 LIMIT 10;
于 2013-02-27T10:13:12.960 に答える