2015-11-09 2 views
1

У меня есть следующий запрос в mysql, который сортирует строки в порядке возрастания rm.meta_val. Но, кроме того, я хочу, чтобы нулевые строки meta_val были позиционированы последним. Может ли кто-нибудь помочь?Как заказать ASC, но отсортировать нуль в последнем в mysql?

SELECT rt.tax_id,ra.*, 
FROM req_tax rt, req_aspects ra, req_meta rm 
where ra.aspect_id = rt.req_aspects_id 
     and rt.tax_id=rm.req_tax_id 
     and rm.req_id = rt.req_id and rt.requests_id = 18 
group by rt.tax_id 
ORDER BY rm.meta_val asc; 

ответ

0

Использование IF в ORDER BY пункте:

ORDER BY 
    IF(rm.meta_val IS NULL, 1, 0), 
    rm.meta_val asc; 
0

попробовать с case:

SELECT rt.tax_id,ra.*, 
    FROM req_tax rt, req_aspects ra, req_meta rm where ra.aspect_id = rt.req_aspects_id 
    and rt.tax_id=rm.req_tax_id and rm.req_id = rt.req_id and rt.requests_id = 18 group by rt.tax_id 
order by case when rm.meta_val is null then 1 else 0 end, rm.meta_val 
0

Попробуйте использовать запрос ISNULL: -

order by ISNULL(rm.meta_val), rm.meta_val ASC 

Ваш запрос так: -

SELECT rt.tax_id,ra.*, 
FROM req_tax rt, req_aspects ra, req_meta rm where ra.aspect_id = rt.req_aspects_id 
and rt.tax_id=rm.req_tax_id 
and rm.req_id = rt.req_id and rt.requests_id = 18 group by rt.tax_id order by ISNULL(rm.meta_val), rm.meta_val ASC; 
1

Вы можете сортировать на результат функции, поэтому используйте if, чтобы проверить, является ли нулевое значение, и если да, возвращать очень большое значение, в противном случае возвращает значение. В идеале вы бы выбрали значение того же типа (количество бит, подписанное vs без знака) на основе сопоставленного значения Max плюс один, поскольку это позволяет избежать поощрения типа, но это может быть не важно для вас. Переключите if, если вы хотите, чтобы нули на другом конце

SELECT rt.tax_id,ra.*, 
FROM req_tax rt, req_aspects ra, req_meta rm 
WHERE ra.aspect_id = rt.req_aspects_id 
    AND rt.tax_id=rm.req_tax_id 
    AND rm.req_id = rt.req_id 
    AND rt.requests_id = 18 
GROUP BY rt.tax_id 
ORDER BY if(rm.meta_val is NULL, 0xFFFFFFFF, rm.meta_val) asc; 
Смежные вопросы