上一个下一个记录订单语句


Previous next record order statement

我有以下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设置为假(以前的记录):(

我该如何解决这个问题?

我认为你面临的问题是排序不稳定。稳定排序每次运行时总是返回相同的记录顺序。在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将使排序稳定,并应该得到正确的结果。