上一个下一个记录订单声明

时间:2013-06-13 17:18:52

标签: php sql

我有以下SQL语句可以获取相对于当前记录的上一条或下一条记录:

SELECT DISTINCT name FROM items
   WHERE category = ? AND $field $operator ? AND visible = 1
   ORDER BY $field $direction LIMIT 1

变量设置如下:

// these two may change
$field   = 'name';
$getNext = true;

if($getNext){
  $direction = 'ASC';
  $operator  = '>';

}else{
  $direction = 'DESC';
  $operator  = '<';
}

如果$field是一个唯一字段,这似乎有效,但如果不是,当$getNext设置为false(前一条记录)时,我得到一些奇怪的结果:(

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为您面临的问题是排序不稳定。稳定排序始终在每次运行时返回相同的记录顺序。在SQL中,只有在值是唯一的时才能获得稳定的排序。

您可以通过在name子句中添加order by来解决此问题:

SELECT DISTINCT name
FROM items
WHERE category = ? AND $field $operator ? AND visible = 1
ORDER BY $field $direction, name
LIMIT 1

当字段具有相同的值时,添加name会使排序稳定,并且可以为您提供正确的结果。