Mysql 如何在ORDERBY if语句中使用ASC/DESC?

Mysql 如何在ORDERBY if语句中使用ASC/DESC?,mysql,sorting,Mysql,Sorting,问题是:“如何通过使用if值的sql语句进行排序?” 我有一个表,其中有一个参数,使用这个参数,我必须按ASC或DESC对单个列进行排序。我怎样才能做到呢 我知道ASC和DESC参数不能在IF块中(并且具有类似于此的结构。“IF(Type='1',ranking,ranking)ASC/DESC”),因此,哪一个是在select in base中对参数进行排序的替代方案 示例 该表类似于: ID | RANKING | TYPE -------------------- 1 | 12 | 1 2

问题是:“如何通过使用if值的sql语句进行排序?”

我有一个表,其中有一个参数,使用这个参数,我必须按ASC或DESC对单个列进行排序。我怎样才能做到呢

我知道ASC和DESC参数不能在IF块中(并且具有类似于此的结构。“IF(Type='1',ranking,ranking)ASC/DESC”),因此,哪一个是在select in base中对参数进行排序的替代方案

示例

该表类似于:

ID | RANKING | TYPE
--------------------
1 | 12 | 1
2 | 10 | 1
3 | 14 | 2
4 | 15 | 2
Type=1必须是ASC订单,Type=2必须是DESC订单,因此我的选择的预期结果可能是:

ID | RANKING | TYPE
--------------------
2 | 10 | 1
1 | 12 | 1
4 | 15 | 2
3 | 14 | 2

有什么想法吗?

不确定你的意思:“…在一个select in base中对一个参数进行排序。”-你不小心在那里说了几句话

但如果这有帮助,您可以按以下多个字段排序:

... ORDER BY type ASC, ranking DESC
和按派生值排序:

... ORDER BY IF(ranking = 2, 1, 0) DESC, ranking ASC

这将首先放置所有的“排名=2”记录,然后将所有其他排名记录升序。

在按类型排序后,如果(type=2,-排名,排名)按
排序如何?否定排名将导致该类型的顺序相反

编辑

由于
ranking
VARCHAR
列,因此需要将其转换为数字才能使用此技术

SELECT * FROM test ORDER BY type ASC, CAST(ranking as SIGNED)*IF(type = 1, 1, -1) ASC;

您可以直接在

处测试代码您的意思是说您有一个带参数的存储过程吗?它看起来像什么?创建表如果不存在
test
id
smallint(5)无符号非空自动增量,
ranking
varchar(15)非空,
type
tinyint(1)无符号非空,主键(
id
)引擎=InnoDB默认字符集=utf8自动增量=5;将值(1,'12',1),(2,'10',1),(3,'14',2),(4,'15',2)插入
测试(
id
排名
类型
);请参阅预期输出。排序顺序取决于类型。是的,排序列只能用作“排序依据”的条件,而不能用作顺序本身。我尝试了您的解决方案,但它不起作用。。。如果(type=1,ranking,-ranking)ASC,则使用或不使用-SELECT*FROM
test
ORDER BY type ASC,结果相同。结果是14/15,而不是15/14。奇数。我刚刚用你发布的相同数据创建了一个测试表,我得到了预期的结果。使用相同的数据和我上面发布的相同查询?哇。我没有注意到
排名
VARCHAR
。很抱歉。现在更新我的答案。尽管有什么原因不能使用
INT
ORDER BY type 
       , CASE WHEN type = 1
                THEN ranking 
              ELSE NULL               --- implied, this line can be omitted
                                      --- or changed into:   ELSE ''
                                      --- or:    ELSE someConstant
         END 
       , ranking DESC