PostgreSQL中的循环ORDER BY排序

时间:2014-01-03 11:03:11

标签: php sql postgresql

我在尝试在PostgreSQL中排序时遇到了一些问题。我想选择信息,但按照传递给查询的特定值进行排序,然后从那里开始。例如 说我有以下数字。

31, 30, 29, 28, 27, 26, 25  

我希望能够按28排序,结果将是,

28, 27, 26, 25, 31, 30, 29

我似乎无法让它工作我试图在数组中用PHP对它进行排序而无法解决它所以我采用了DB的方式。这是我试过的查询。

<?php
    $sql_query="SELECT * FROM album_photos WHERE 
    alb_id=".$alb_id." ORDER BY CASE WHEN pho_id='".$pid."' 
    then 1 ELSE 2 END, pho_id DESC"; 

我需要这个的原因是因为我需要通过点击的ID进行排序,以便fancybox(灯箱)知道要开始的照片以及下一张和之前的照片。因为画廊是循环的。 感谢帮助。

4 个答案:

答案 0 :(得分:9)

您可以使用此SQL方法。假设您的号码以(id, code)的形式存储在表格中,其中id是序列号(序号1,2,...),code是2位数代码,如示例所示,您可以使用此SQL获得所需的排序:

SELECT code
FROM mytable
ORDER BY id < 3, id

其中3是表中开始排序的示例。这是SQLFiddle Demo

UPDATE :解释原因:ORDER BY子句有2个元素: id < 3id。第一个表达式id < 3属于BOOLEAN类型,前两个元素为TRUE,其他元素为FALSE。按此标准排序将确保前2个元素将是输出的最后2个元素,因为FALSE&lt; TRUE。第二个排序标准id正常排序。

换句话说,1,2,3,4,5,6,7的输入序列将在输出时循环到3,4,5,6,7,1,2。

更新2 :如果您只有一个主要列,请使用此示例获取您的确切输出:SQLFiddle

答案 1 :(得分:0)

喜欢“test1604”描述:

SELECT * 
FROM album_photos 
WHERE alb_id=".$alb_id." AND pho_id >='".$pid."'
ORDER BY pho_id
UNION
SELECT * 
FROM album_photos 
WHERE alb_id=".$alb_id." AND pho_id <'".$pid."'
ORDER BY pho_id

未经测试......

答案 2 :(得分:0)

您只能按列中的值排序:该列中的所有值。你这样说:

order by columnName [, columnName2, columnName3]

(如果您想按多列排序,请使用名称2和名称3额外的列名称。)

您的问题的值为25到31.这些值是否在列中?如果是这样,那么你就无法做你想做的事。你可以这么说。

where columnName = 28

......但这似乎不适合你的问题。

28是列中的值,还是列名?只有当它是一个列名时,你才能理解它。所以你需要在这里扩展信息,例如表格定义和要求声明比你给出的那个更广泛。

答案 3 :(得分:0)

有一种简单的方法可以做你想做的事情(假设我正确理解它是什么):

select *
from album_photos
where alb_id=$alb_id
order by -sign(photo_id - ($pid - 1)), $pid