2011-09-21 26 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

相关问题