我很難創建一個MySql查詢,它將逐行搜索一個表,然後在每一邊返回5個周圍的行。Mysql得到一些前後行
的問題是各行按字母順序排列,並基本點是讓11行與當前正好在中間,而他們是按字母順序排列,我們不能使用id字段
。
我很難創建一個MySql查詢,它將逐行搜索一個表,然後在每一邊返回5個周圍的行。Mysql得到一些前後行
的問題是各行按字母順序排列,並基本點是讓11行與當前正好在中間,而他們是按字母順序排列,我們不能使用id字段
。
這對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
我喜歡這個主意,但我認爲你錯了代碼中的某些東西,我不斷收到錯誤= UNION的錯誤用法和ORDER BY – 2013-02-27 15:48:02
@ Vadim.G。 。 。我忘了在子查詢周圍放置圓括號。當使用'order by'和'limit'時,它們是需要的。 – 2013-02-27 16:16:04
是的,我抓住了那一個,但它不會返回正確的結果,第二部分返回正確的順序完美,但第一部分返回desc而不是asc的所有結果,所以我試圖做的是將所有內容作爲結果並做一個排序依據,但它似乎返回一個錯誤。 有什麼想法? – 2013-02-27 16:41:14
嘗試像下面,根據您的參數:
SELECT * FROM table WHERE id < 5 LIMIT 10
UNION
SELECT * FROM table WHERE id = 5
UNION
SELECT * FROM table WHERE id > 5 LIMIT 10;
像我說你不能使用ID,因爲它dosnt有正確的順序 – 2013-02-27 10:15:49
OP指出,他不能依靠ID – Yaroslav 2013-02-27 10:16:47
所以,你要選擇行範圍,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
查詢看起來不錯,但我需要它返回特定行的行,例如。 而搜索「sfdgd」,它應該返回 6 4gfhfrgfr 7 zxcxvfdf 8 sfdgd 9 s8545454 10 7jhgdfe45 – 2013-02-27 11:02:33
是的,但正如我指出的那樣,是一個棘手的情況下,如果你不能依靠ID。我嘗試了不同的解決方案,但似乎使用'UNION'更簡單。在網上搜索'mysql range row select'來獲得和我一樣的結果,這裏有一些類似的問題,但是你需要調整以使用「圍繞特定行」的問題。 – Yaroslav 2013-02-27 11:07:11
您可以用臨時表解決這個問題,如果你沒有太多的記錄你的桌子:
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
我試圖通過現場佈置,然後導入使用PHP其導入到我的網頁。然後解析它在頁面上,這是不好的,因爲我有一個大分貝 – 2013-02-27 10:18:41