MySQL使用FIND_IN_SET命令多个方向

时间:2011-11-16 08:52:26

标签: mysql

我的查询按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之前。

可以使用单个查询完成吗?

2 个答案:

答案 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;