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