我有一個窗體來編輯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 typ
<Ÿtyp
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。
隱式聯接是一種反模式。我建議你使用明確的連接,並從1989年開始。 – Johan
前兩個代碼是由我瞭解sql的人給我的。我只是新手,所以我不明白你的意見。前兩個代碼也取自一個在我的國傢俱有良好聲譽的網站。 – Joe
隱式聯接的問題在於它們混合了過濾器和聯接條件。這很糟糕,而且由於這個原因顯式連接語法,請參閱下面的答案。是1992年發明的(!)。這裏加入標準是分開列出的。這使查詢更清晰,更易於調試。否則它的作用是一樣的。 – Johan