我有一个窗体来编辑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