2015-11-18 2 views
0

Предположим, у меня есть столбец, содержащий значение поплавка от 1 до 100.SQL order_by выражение

Я хотел бы иметь возможность превратить это значение в менее точное целое число от 1 до 10, а затем упорядочить результаты по этому новому значению.

Может показаться странным, чтобы сделать заказ менее точным, но оператор SQL упорядочен по 2 столбцам, а если первый слишком точен, то столбец 2-го порядка не будет иметь веса.

По существу, я хотел бы сгруппировать свой первый заказ на 10 групп и затем упорядочить каждую из этих групп другим столбцом.

SELECT "sites".* FROM "sites" ORDER BY "sites"."rating" DESC, "sites"."price" ASC LIMIT 24 OFFSET 0 

редактировать: Это приложение рельсы, используя PostGreSQL

ответ

1
SELECT "sites".* 
FROM "sites" 
ORDER BY FLOOR("sites"."rating"/10) DESC, "sites"."price" ASC 
LIMIT 24 OFFSET 0 
1

Что SQL является то, что? Используйте функцию разделения и, если необходимо, округлите ее.

В MySQL обратите внимание на команду DIV. У меня нет средств проверить это прямо сейчас, но это может помочь вам в правильном направлении:

SELECT "sites". * FROM "sites" ORDER BY "sites". "Rating" DIV 2 DESC ...

+0

Спасибо, я буду смотреть в команду Див. Это приложение rails, а SQL - то, что генерирует ActiveRecord для postgresql. – Drewsdesign

+0

Nice catch, @JoelCoehoorn – Paurian

+0

Должен быть MySql. Это основная платформа для использования нестандартного предложения LIMIT. Большинство других БД используют стандартный синтаксис OFFSET/FETCH NEXT ansi (часто в дополнение к собственному проприетарному расширению, но, по крайней мере, синтаксис ansi тоже работает). –

1

Используйте круглую функцию следующим образом:

Select sites.* 
    from sites 
    order by round(sites.rating/10, -1) desc, sites.price desc 

Это преобразует значение 99 до 10.

+0

Если это не совсем ударит: если вы можете заставить цену всегда быть от нуля до единицы, то вы должны получить идеальный вид: Закажите по раунду (sites.rating/10, -1) + sites.price по убыванию –