【问题标题】:MySQL: How to avoid division by zero when ordering?MySQL:订购时如何避免被零除?
【发布时间】:2013-12-18 12:34:49
【问题描述】:

我需要执行以下操作:

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

但我知道 votesDown 可以承受 0(零)作为其值。我怎样才能避免被零除?

OBS:在我的情况下,可以让votesDown 变成 1,当 0 时。

【问题讨论】:

  • SELECT * FROM Video WHERE visible = 1 ORDER BY votesUp/IF(votesDown = 0, 1, votesDown) DESC ??
  • @InoS Heo 是的!有用。对不起,如果这很明显,我只是 MySQL 的新手。发布为答案,以便我可以给你积分。
  • 我个人只会使用(votesUp+1/votesDown+1)。排序将大致相同,尽管我现在无法在数学上证明这一点。
  • @Kylotan 我明白你的意思。它非常聪明,一旦它解决了问题,并且随着数字变大,常数就无关紧要了。太棒了。

标签: mysql sql divide-by-zero


【解决方案1】:

通过IF()函数,您可以将0转换为1。 你能试试这个吗?

SELECT *
FROM Video
WHERE visible = 1 
ORDER BY votesUp / IF(votesDown = 0, 1, votesDown) DESC

【讨论】:

    【解决方案2】:

    这样就可以了:

    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;
    

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多