2013-06-13 3 views
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 (предыдущая запись) :(

Как я могу это исправить?

+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 сделает вид стабильным и вы должны получить правильные результаты.

+0

В приведенном выше примере имя уже включено в сортировку (поле $). – asmecher

+0

@asmecher. , , Но тогда он должен быть уникальным из-за «отличительного». В чем же проблема? –

+0

Согласовано, OTOH, но этот подход не позволит следующий/предыдущий просмотр записей, имеющих одно и то же имя. Какими могут быть «странные результаты», о которых он говорит, хотя это не ясно. – asmecher