2011-09-21 24 views
0

我有一個窗體來編輯mysql表列。有些鏈接可以點擊並加載上一頁,下一頁,第一行或最後一行。我可以訂購這些欄目(最多可以訂購四欄)。所以當我按Prev時。或者接下來,列必須先排序,然後我才能得到結果。我爲此使用mysql View。知道列是文本很重要,但id是數字。我通常按​​第一個文本列,然後按ID排序。如何選擇由多個文本列排序的上一行或下一行

這裏是我的查詢,對我工作的單列順序。

上一頁:

SELECT x.* 
    FROM test_view x, test_view y 
    WHERE y.`id` = 13 
      AND (x.`cat` < y.`cat` OR (x.`cat` = y.`cat` AND x.`id` < y.`id`)) 
ORDER BY x.`cat`, x.`id` DESC 
    LIMIT 0,1 

下一頁:

SELECT x.* 
    FROM test_view x, test_view y 
    WHERE y.`id` = 13 
      AND (x.`cat` > y.`cat` OR (x.`cat` = y.`cat` AND x.`id` > y.`id`)) 
ORDER BY x.`cat`, x.`id` ASC 
    LIMIT 0,1 

我試圖擴大這一發現多列,因爲這:

SELECT x . * 
FROM ukazka_view x, ukazka_view y 
WHERE y.`id` =1 
AND (
x.`cat` < y.`cat` 
OR (
x.`cat` = y.`cat` 
AND x.`id` < y.`id` 
) 
) 
AND (
x.`typ` < y.`typ` 
OR (
x.`typ` = y.`typ` 
AND x.`id` < y.`id` 
) 
) 
AND (
x.`diff` < y.`diff` 
OR (
x.`diff` = y.`diff` 
AND x.`id` < y.`id` 
) 
) 
ORDER BY x.`cat` DESC , x.`typ` DESC , x.`diff` DESC , x.`id` DESC 
LIMIT 0 , 1 

但這一直沒有結果。

編輯:

我試着寫一個查詢情況下實際行ID爲1

SELECT x.* FROM ukazka_view x INNER JOIN ukazka_view y ON 
(x.`cat` < y.`cat` OR 
(x.`cat` = y.`cat` AND x.`id` < y.`id`) OR 
(x.`cat` = y.`cat` AND y.`id` = 1 AND x.`id` > y.`id`)) 

和 (X typtyp OR (X typ。 = y。typ AND x。id < y。id)或 (x。typ = y。typ和y。 id = 1 AND x。 y。 id)) AND (X。diff <收率diff OR (X。diff = Y。diff和X。id <收率id)OR (X。diff = Y。diff和y。id = 1 AND x。id> y。id)) WHERE y。 id = 1 ORDER BY x。 cat DESC,x。 typ DESC,x。 diff DESC,x。 id DESC LIMIT 0,1

這尋找前一行。行爲有點奇怪,但有效。所以當我走到最後的價值時,我得到了id = 1。然後當我按前一個(這個查詢)它得到id = 82,當我再次按下以前id = 81等等,直到我有id = 2。只有當我按/選擇Last時,我纔得到id = 1。

+0

隱式聯接是一種反模式。我建議你使用明確的連接,並從1989年開始。 – Johan

+0

前兩個代碼是由我瞭解sql的人給我的。我只是新手,所以我不明白你的意見。前兩個代碼也取自一個在我的國傢俱有良好聲譽的網站。 – Joe

+0

隱式聯接的問題在於它們混合了過濾器和聯接條件。這很糟糕,而且由於這個原因顯式連接語法,請參閱下面的答案。是1992年發明的(!)。這裏加入標準是分開列出的。這使查詢更清晰,更易於調試。否則它的作用是一樣的。 – Johan

回答

0
SELECT x.* 
FROM ukazka_view x 
INNER JOIN ukazka_view y 
    ON (x.cat < y.cat OR (x.cat = y.cat AND x.id < y.id)) 
    AND (x.typ < y.typ OR (x.typ = y.typ AND x.id < y.id)) 
    AND (x.diff < y.diff OR (x.diff = y.diff AND x.id < y.id)) 
WHERE y.id = 1 
ORDER BY x.cat DESC , x.typ DESC , x.diff DESC , x.id DESC 
LIMIT 1 OFFSET 0 

我該查詢看到的問題是,一個ID不能小於1
所以x.id < y.id將永遠是假的。
這隻

.... 
    ON (x.cat < y.cat) 
    AND (x.typ < y.typ) 
    AND (x.diff < y.diff) 

爲連接標準樹葉。

+1

'(x.cat

+0

@ypercube,哇你從哪裏得到那顆寶石?我很想有一個鏈接記錄這種行爲。 – Johan

+0

@Johan:「我用這個查詢看到的問題是一個id不能小於1」。 - 你的意思是說問題中的兩個第一個代碼應該不起作用?我現在測試了你的代碼,它似乎運行良好。在這一刻,我正試圖修復我的代碼,以便與First和Last一起工作。 Thanx爲這個代碼。 – Joe

相關問題