如何按列而不是按字母顺序排列查询
How to order query by column not in alphabetical order
我正在使用 Phalcon 的 QueryBuilder 构建查询,returning 完整的模型对象。我需要按时间顺序按 "semester" 列对查询进行排序。问题是列的内容是 "F"、"W"、"G"、"S",这是我需要对值进行排序的顺序。所以所有行"F"先来,然后"W",以此类推
首先我尝试使用 MySQL FIELD() 函数进行排序,但我遇到了解析异常,所以我认为 PDO 不支持它。我无法以任何一种方式找到任何文档。
然后,我尝试使用 QueryBuilder 的 ->columns()
方法,但这重命名了我的所有列,并导致 return 类型不是模型对象。
放弃 QueryBuilder 并仅使用原始 SQL 查询不是我要考虑的选项 - 我有一个围绕 QueryBuilder 构建的复杂框架,重写它会花费太多工作。
我最后的尝试是简单地改变 "semester" 在数据库中的存储方式,"F" 为 0,"W" 为 1,等等。我宁愿不改变数据,如果我可以让它在代码中工作。
有什么想法吗?
您可以像这样尝试使用用户定义的select加入
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
您可以使用 orderBy 函数尝试此字符串:
"CASE
WHEN Semester = 'F' THEN 0
WHEN Semester = 'W' THEN 1
WHEN Semester = 'G' THEN 2
ELSE 3
END"
我正在使用 Phalcon 的 QueryBuilder 构建查询,returning 完整的模型对象。我需要按时间顺序按 "semester" 列对查询进行排序。问题是列的内容是 "F"、"W"、"G"、"S",这是我需要对值进行排序的顺序。所以所有行"F"先来,然后"W",以此类推
首先我尝试使用 MySQL FIELD() 函数进行排序,但我遇到了解析异常,所以我认为 PDO 不支持它。我无法以任何一种方式找到任何文档。
然后,我尝试使用 QueryBuilder 的 ->columns()
方法,但这重命名了我的所有列,并导致 return 类型不是模型对象。
放弃 QueryBuilder 并仅使用原始 SQL 查询不是我要考虑的选项 - 我有一个围绕 QueryBuilder 构建的复杂框架,重写它会花费太多工作。
我最后的尝试是简单地改变 "semester" 在数据库中的存储方式,"F" 为 0,"W" 为 1,等等。我宁愿不改变数据,如果我可以让它在代码中工作。
有什么想法吗?
您可以像这样尝试使用用户定义的select加入
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
您可以使用 orderBy 函数尝试此字符串:
"CASE
WHEN Semester = 'F' THEN 0
WHEN Semester = 'W' THEN 1
WHEN Semester = 'G' THEN 2
ELSE 3
END"