【问题标题】:MySQL: Order only values greater than a specific valuesMySQL:仅订购大于特定值的值
【发布时间】:2014-06-29 00:08:24
【问题描述】:

我有下表:

CREATE TABLE `data`
(`id` int, `x` int, `y` int);

INSERT INTO `data`
(`id`, `x`, `y`)
VALUES
(1, 5, 7),
(2, 9, 3),
(3, 4, 6),
(4, 0, 0),
(5, 0, 0),
(6, -1, 2);

我需要从表中选择所有数据,并按 (x, y) 对中的最大值对它们进行升序排序。但只有 x 和 y 都大于 0 的值。 (x, y) 对中的一个小于 0 的行应放置在有序值下方,其余行位于所选列表的末尾。

我有以下 SQL 查询:

SELECT `x`, `y`, GREATEST (`x`, `y`) as `result` FROM `data`
ORDER BY `result`=0, `result`=-1, `result` ASC

这给了我以下结果:

X   Y   RESULT
-1  2   2
4   6   6
5   7   7
9   3   9
0   0   0
0   0   0

但我想要的结果是:

X   Y   RESULT
4   6   6
5   7   7
9   3   9
-1  2   2
0   0   0
0   0   0

SQLfiddle:http://www.sqlfiddle.com/#!2/995d2/6

【问题讨论】:

  • btw .. 我知道查询是错误的,因为如果我选择 result 作为 (x,y) 中的最大值,条件 result=-1 将永远不会为真。如果两个值都是“-1”,则此查询有效,但如果只有一个值是“-1”,我需要修改它才能工作。

标签: mysql sql


【解决方案1】:

这就是使用case-when 的方法

SELECT 
`x`, 
`y`, 
GREATEST (`x`, `y`) as `result` 
FROM `data` 
ORDER BY 
case 
  when x > 0 and y > 0 then 0 
  when x < 0  OR y < 0 then 1
  when result = 0 then 2
end,
result
ASC

DEMO

【讨论】:

  • 但我需要将result 升序排序,如果我更改 DESC -> ASC,那么它又不正确。
  • 当 x 和 y 都是 +ve 时,它​​们将按升序出现,然后如果一个是 -ve 然后两个都是 0,你能解释一下吗?
  • 您可以通过将when result = 0 then 2 替换为简单的else 2 来进一步简化它:-)
  • 是的。这正是我所需要的!非常感谢!
猜你喜欢
  • 2021-06-13
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多