我的查询按FIND_IN_SET
排序,然后是辅助订单字段... date_added。
我现在想要的是:
ORDER BY FIND_IN_SET(status, '1,2,3'), date_added ASC
AND
ORDER BY FIND_IN_SET(status, '4,5'), end_date DESC
所以我想通过date_added ASC
订购状态1,2和3,通过end_date DESC
订购状态4和5,但我希望输出状态1,2和3的所有结果在状态4和5之前。
可以使用单个查询完成吗?
答案 0 :(得分:0)
这不是ORDER BY
的工作方式。您在同一子句中提供了所有条件,并用逗号分隔。
阅读Sorting Rows章节,以便进行快速监督。
<强>更新强>
您既不提供表格定义也不提供数据样本,因此很难弄清楚您的想法,但我会尝试猜测。 FIND_IN_SET()函数返回第二个参数中第一个参数的索引位置:
SELECT
FIND_IN_SET(2, '1,2,3') AS found,
FIND_IN_SET(4, '1,2,3') AS not_found,
FIND_IN_SET(NULL, '1,2,3') AS null_needle
...返回:
found | not_found | null_needle
2 | 0 | NULL
我知道您希望使用此信息的一部分来组成ORDER BY组件(无论针是否在大海捞针中找到,丢弃其位置)。然后,检查返回值是否大于零应该足够了:
ORDER BY
CASE
WHEN FIND_IN_SET(status, '1,2,3')>0 THEN date_added
WHEN FIND_IN_SET(status, '4,5')>0 THEN end_date DESC
END
答案 1 :(得分:0)
试试这个 -
SELECT * FROM table_name
ORDER BY
IF(FIELD(status, 1,2,3), date_added, '9999-12-31') ASC,
IF(FIELD(status, 4,5), end_date, NULL) DESC;