如何选择多个文本列排序的上一行或下一行

时间:2011-09-21 10:22:04

标签: mysql select sql-order-by

我有一个表单来编辑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&lt; y。typ或     (x。typ = y。typ和x。id&lt; y。id)或     (x。typ = y。typ和y。id = 1 AND x。id&gt; y。id))  和     (x。diff&lt; y。diff或     (x。diff = y。diff和x。id&lt; y。id)或     (x。diff = y。diff和y。id = 1 AND x。id&gt; y。id))  在哪里。id = 1  ORDER BY x。cat DESC,x。typ DESC,x。diff DESC,x。id DESC LIMIT 0,1

这会查找上一行。行为有点奇怪,但有效。所以当我去最后一个值时,我得到id = 1。然后,当我按Previous(此查询)时,它会转到id = 82,当我再次按下上一个id = 81,依此类推,直到我得到id = 2。只有当我按/选择最后一个时,我才能达到id = 1。

1 个答案:

答案 0 :(得分: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)

作为加入标准。