我有以下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(前一条记录)时,我得到一些奇怪的结果:(
我该如何解决这个问题?
答案 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
会使排序稳定,并且可以为您提供正确的结果。