我在尝试在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(灯箱)知道要开始的照片以及下一张和之前的照片。因为画廊是循环的。 感谢帮助。
答案 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 < 3
和id
。第一个表达式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