这是我的表:
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端处理此问题。
答案 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