0

我有以下 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 时我会得到一些奇怪的结果(以前的记录):(

我怎样才能解决这个问题?

4

1 回答 1

1

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

您可以通过添加nameorder by子句来解决此问题:

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

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

于 2013-06-13T17:22:51.160 回答