MySQL基于条件的多订单
我有一个如下的查询,当我仅在MySQL基于条件的多订单,mysql,Mysql,我有一个如下的查询,当我仅在end\u time之前对表进行排序时,该查询起作用: 有效 SELECT * FROM table1 WHERE ... ORDER BY field(table1.status, 'c1','a1', 'b1', 'e1', 'd1') asc, IF(table1.status = 'f1', table1.end_time, '') asc LIMIT 20 OFFSET 0; 但是,如果我想在条件排序中再添加一列,比如: SELECT * FROM tab
end\u time
之前对表进行排序时,该查询起作用:
有效
SELECT * FROM table1 WHERE ... ORDER BY field(table1.status, 'c1','a1', 'b1', 'e1',
'd1') asc, IF(table1.status = 'f1', table1.end_time, '') asc LIMIT 20 OFFSET 0;
但是,如果我想在条件排序中再添加一列,比如:
SELECT * FROM table1 WHERE ... ORDER BY field(table1.status, 'c1', 'a1', 'b1', 'e1',
'd1') asc, IF(table1.status = 'f1', (table1.end_time, table1.start_time), '') asc
LIMIT 20 OFFSET 0;
它给了我:
错误1241(21000):操作数应包含1列
但是,以下不带IF的查询有效:
SELECT * FROM table1 WHERE ... ORDER BY field(table1.status, 'c1', 'a1', 'b1', 'e1',
'd1') asc, table1.end_time, table1.start_time asc LIMIT 20 OFFSET 0;
如果您只想按
表1订购,如何使用实现与上述相同的查询?开始时间当表1.status='f1'
时,您只需添加另一个,如果:
SELECT *
FROM table1
WHERE ...
ORDER BY field(table1.status, 'c1','a1', 'b1', 'e1','d1') asc,
IF(table1.status = 'f1', table1.end_time, '') asc,
IF(table1.status = 'f1', table1.start_time, '') asc
LIMIT 20 OFFSET 0;
我想我找到了一个解决方案,它很难看,因为它重复代码,但我仍然期待更好的答案:
现在,我解决了我的问题,比如:
SELECT * FROM table1 WHERE ... ORDER BY field(table1.status, 'c1', 'a1', 'b1', 'e1', 'd1') asc,
IF(table1.status = 'f1', table1.end_time, '') asc,
IF(table1.status = 'f1', table1.start_time, '') asc
LIMIT 20 OFFSET 0;
看起来您在(table1.end\u time,table1.start\u time)
@sloachrisher中缺少了DATE\u SUB之类的函数,坦率地说,这些字段可以是任何符合要求的内容,它不受日期字段的限制。我可能想按end\u time
和name
对其进行排序,我的目的是让该查询与IFBut一起工作,但是,由于为true
结果,您的表达式没有意义。括号内的两个字段不是有效的表达式。要使其与if表达式一起工作,if表达式必须具有有效的语法。你的没有有效的语法,特别是用逗号分隔的两列。哦,天哪,你键入的速度比我快了一点…但是,无论如何,谢谢。所以,不可能在同一个IF块中?总是发生在我身上!但是我应该因为让查询看起来漂亮而得到额外的分数!:)对于你在第一条评论中提出的问题,答案是否定的,除非你能找到某种方式来组合这两个变量,这样对这两个变量组合进行排序与对这两个变量进行独立排序是一样的。对于相同长度的字符串(可能还有日期),可以使用CONCAT
。对于数字,将第一个值乘以任何可能的第二个值的10次方,然后再加上第二个值也可以。