Здравствуйте. У меня есть таблица, в которой есть столбец со значениями (1), (-1) и (NULL). Скобочки для наглядности. Возможен ли такой запрос который отсортирует данные как (1)-(NULL)-(-1) ибо при простой сортировке он сортирует конечно же как (1)-(-1)-(NULL). Спасибо.
Решил сам
SELECT * FROM `table_name` WHERE type='vote' ORDER BY FIELD(value, '1','NULL','-1');
Только с Join'ном что-то не выходит
Хотя такая сортировка не канает при джойне, когда я складываю две таблички по айдишникам, у некоторых ещё айдишников нет. И тут то сортировка обламывается.
почему бы не NULL не заменить на 0? Сделай для поля default '0'
SlyDeath (11.05.2012/08:18)
Хотя такая сортировка не канает при джойне, когда я складываю две таблички по айдишникам, у некоторых ещё айдишников нет. И тут то сортировка обламывается.
что ты там складываешь то, скинь пример кода, нагляднее будет
FlySelf, Дело в том, что система рейтинга запилина в систему давно и она общая. И мне лишь остаётся написать свой метод работающий на его основе. И вышло так, что >0 это плюсики, <0 минусики, а NULL ничего - это ведь всё логично. Но так как join идёт по id'шникам то соответственно и те, что <0 тоже впереди, впереди NULL на что ты его не поменяй. Пример запроса:
SELECT SQL_CALC_FOUND_ROWS * FROM `order_feedbacks` AS `of`
LEFT JOIN `voting_rate` AS `vr` ON (vr.nid = of.order_id)
Либо join должен быть хитрым, либо это просто нереально сделать. Хотя насколько я знаю MySQL довольно мощная система.
Есть два поля. В одном общее количество плюсов (up) в другом минусов (down). Вот мне надо все плюсы выцепить и сортировать по DESC, а минусы сортировать по time как-будто за них и не голосовали вообще. Одним запросом.
Решено созданием столбика с весом с помощью CAST, вычитанием значения up - down.
SELECT * ,
IFNULL(CAST(`vr`.`up` AS SIGNED ) - CAST(`vr`.`down` AS SIGNED),0) AS `pos`
FROM `order` AS `of`
LEFT JOIN `rate` AS `vr` ON ( vr.nid = of.order_id )
AND (vr.type = 'order')
WHERE (of.published = 'y')
ORDER BY `pos` DESC , `time` DESC
LIMIT 0, 30