MySQL按自定义列选择订单

时间:2017-04-12 21:40:45

标签: mysql sql

这是我的表:

id | val | flag
---|-----|------
 1 | 10  |  no
---|-----|------
 2 | 5   | yes
---|-----|------     
 3 | 3   | yes
---|-----|------     
 4 | 25  | no
---|-----|------     
 5 | 8   | no
---|-----|------     

基本上我想按id + custom column选择custom column desc顺序,其中:

custom column = val     (if flag = no)
custom column = val * 2 (if flag = yes)

我的选择结果应输出:

| id | cus | 
|----|-----|
|  4 | 25  |
|----|-----|
|  1 | 10  |
|----|-----|   
|  2 | 10  | 
|----|-----|    
|  5 | 8   | 
|----|-----|    
|  3 | 6   |
|----|-----|

不要问我尝试了什么,因为我是mysql的新手。我知道如何在php中执行此操作,但我想最好从mysql端处理此问题。

5 个答案:

答案 0 :(得分:1)

我认为你可以做到:

select t.*
from t
order by (case when flag = 'no' then val when flag = 'yes' then 2*val end) desc, id;

注意:如果flag只能是“否”或“是”,请将其简化为:

select t.*
from t
order by (case when flag = 'no' then val else 2*val end) desc, id;

答案 1 :(得分:0)

您可以使用case这样的语句

select id, val, cus from (
select id, val, case when flag = 'no' then val when flag = 'yes' then val*2 else val end as cus from my_table
) a
order by cus desc;

或者,当您不希望外部选择时,也会在order语句中使用case语句作为另一个答案建议。

如果既没有出现也没有出现,案例陈述中的else部分可用于处理案件。在我的示例中,它只返回val

答案 2 :(得分:0)

用例陈述。

SELECT id,
CASE
  WHEN flag = 'no' THEN val
  WHEN flag = 'yes' THEN val*2
END AS cus
FROM table
ORDER BY cus DESC

答案 3 :(得分:0)

除了Gordon的解决方案(它表明你可以按列排序,即使它们不是结果的一部分),如果你想在你的结果中包含自定义值,那么你可以写一些东西像这样:

select id, if (flag='no',val,val*2) as cus
from mytable
order by cus desc

答案 4 :(得分:0)

data:image/png;base64