2013-02-27 47 views
1

我很難創建一個MySql查詢,它將逐行搜索一個表,然後在每一邊返回5個周圍的行。Mysql得到一些前後行

的問題是各行按字母順序排列,並基本點是讓11行與當前正好在中間,而他們是按字母順序排列,我們不能使用id字段

+0

我試圖通過現場佈置,然後導入使用PHP其導入到我的網頁。然後解析它在頁面上,這是不好的,因爲我有一個大分貝 – 2013-02-27 10:18:41

回答

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 

查詢的第一部分返回前五個。第二個返回之後的五個。

順便說一句,如果你有重複,你可能反而要這樣:

(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 
+0

我喜歡這個主意,但我認爲你錯了代碼中的某些東西,我不斷收到錯誤= UNION的錯誤用法和ORDER BY – 2013-02-27 15:48:02

+0

@ Vadim.G。 。 。我忘了在子查詢周圍放置圓括號。當使用'order by'和'limit'時,它們是需要的。 – 2013-02-27 16:16:04

+0

是的,我抓住了那一個,但它不會返回正確的結果,第二部分返回正確的順序完美,但第一部分返回desc而不是asc的所有結果,所以我試圖做的是將所有內容作爲結果並做一個排序依據,但它似乎返回一個錯誤。 有什麼想法? – 2013-02-27 16:41:14

-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; 
+0

像我說你不能使用ID,因爲它dosnt有正確的順序 – 2013-02-27 10:15:49

+0

OP指出,他不能依靠ID – Yaroslav 2013-02-27 10:16:47

1

所以,你要選擇行範圍,ROW_NUMBER應該是你的朋友,因爲你說你不能依靠ID。請檢查此廣泛接受和詳細的SO answer有關使用mySQL ROW_NUMBER

然後嘗試工作SQL Fiddle code。但我仍在調整它,因爲它通過設置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 
+0

查詢看起來不錯,但我需要它返回特定行的行,例如。 而搜索「sfdgd」,它應該返回 6 4gfhfrgfr 7 zxcxvfdf 8 sfdgd 9 s8545454 10 7jhgdfe45 – 2013-02-27 11:02:33

+0

是的,但正如我指出的那樣,是一個棘手的情況下,如果你不能依靠ID。我嘗試了不同的解決方案,但似乎使用'UNION'更簡單。在網上搜索'mysql range row select'來獲得和我一樣的結果,這裏有一些類似的問題,但是你需要調整以使用「圍繞特定行」的問題。 – Yaroslav 2013-02-27 11:07:11

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