MySQL: Как избежать деления на ноль при заказе?

Мне нужно сделать что-то вроде следующего:

SELECT * FROM Video WHERE visible = 1 ORDER BY votesUp/votesDown DESC

Но я знаю, что votesDown может иметь значение 0 (ноль). Как я могу обойти, чтобы избежать деления на ноль?

OBS: В моем случае нормально сделать votesDown равным 1, когда 0.


person Ramon K.    schedule 18.12.2013    source источник
comment
SELECT * FROM Video WHERE visible = 1 ORDER BY voicesUp/IF(votesDown = 0, 1, voicesDown) DESC ??   -  person Jason Heo    schedule 18.12.2013
comment
@InoS Хео Да! Оно работает. Извините, если это было так очевидно, я просто новичок в MySQL. Напишите как ответ, чтобы я мог дать вам очки.   -  person Ramon K.    schedule 18.12.2013
comment
Лично я бы просто использовал (votesUp+1/votesDown+1). Порядок был бы почти таким же, хотя я не могу доказать это математически прямо сейчас.   -  person Kylotan    schedule 18.12.2013
comment
@Kylotan Я понимаю твою точку зрения. Это очень умно, как только это убивает проблему, и константа не имеет значения, поскольку числа становятся больше. Потрясающий.   -  person Ramon K.    schedule 18.12.2013


Ответы (2)


С помощью функции IF() вы можете преобразовать 0 в 1. Не могли бы вы попробовать это?

SELECT *
FROM Video
WHERE visible = 1 
ORDER BY votesUp / IF(votesDown = 0, 1, votesDown) DESC
person Jason Heo    schedule 18.12.2013

Это будет делать:

SELECT * FROM Video WHERE visible = 1
ORDER BY votesUp / CASE votesDown WHEN 0 THEN 1 ELSE votesDown END DESC;

Тем не менее, вы обычно заказываете по проценту голосов «за» от всех голосов. Когда голосов нет вообще, результат не определен, поэтому тогда используйте NULL:

SELECT * FROM Video WHERE visible = 1
ORDER BY votesUp / NULLIF(votesUp + votesDown, 0) DESC;
person Thorsten Kettner    schedule 18.12.2013