如何按列而不是按字母顺序对查询进行排序


How to order query by column not in alphabetical order

我正在使用Phalcon的QueryBuilder构建一个查询,返回完整的模型对象。我需要按时间顺序,按"学期"列对查询进行排序。问题是列的内容是"F"、"W"、"G"、"S",这是我需要对值进行排序的顺序。所以所有带有"F"的行都先出现,然后是"W",等等。

首先,我尝试使用MySQL FIELD()函数订购,但我遇到了解析异常,所以我认为PDO不支持它。无论如何,我都找不到任何文档。

然后,我尝试使用QueryBuilder的->columns()方法,但这重命名了我的所有列,并导致返回类型不是模型对象。

删除QueryBuilder并只使用原始SQL查询不是我要考虑的选项——我有一个围绕QueryBuilder构建的复杂框架,重写起来需要太多的工作。

我的最后一次尝试是简单地更改"terminate"在数据库中的存储方式,"F"为0,"W"为1,等等。如果我能在代码中使用这些数据,我宁愿不更改数据。

有什么想法吗?

您可以使用orderBy函数尝试此字符串:

"CASE
 WHEN Semester = 'F' THEN 0
 WHEN Semester = 'W' THEN 1
 WHEN Semester = 'G' THEN 2
 ELSE 3
 END"

您可以尝试加入用户定义的选择,如

SELECT *
FROM yourtable
INNER JOIN
(SELECT 'F' as code,0 as sequence
 UNION
 SELECT 'W' as code,1 as sequence
 UNION
 SELECT 'G' as code,2 as sequence
 UNION
 SELECT 'S' as code,3 as sequence)
as T ON T.code = yourtable.column
ORDER BY T.sequence ASC

或者你可以使用FIND_IN_SET()函数来定义你的订单,就像这个

SELECT
  *,
  FIND_IN_SET(code,'F,W,G,S') as sequence
FROM semester
ORDER BY sequence ASC