对某些字段使用“按字段排序”,但在日期字段中保持顺序-MySQL PHP

对某些字段使用“按字段排序”,但在日期字段中保持顺序-MySQL PHP,php,mysql,Php,Mysql,我在MySQL中有一个表,它有两个非常重要的字段STATUS和DATE 在STATUS字段中,值可以是“wait”、“ok”、“2edit”或“no”,因此我使用“SELECT*FROM table ORDER BY field(request_STATUS”、“wait”、“2edit”、“ok”、“no”)获取值 到目前为止还不错。但是我需要有STATUS=“wait”的结果才能符合日期顺序。可能吗 我希望我已经通过了这个想法 谢谢。在按请求状态排序后,您通常可以根据日期对数据进行排序 SE

我在MySQL中有一个表,它有两个非常重要的字段STATUS和DATE

在STATUS字段中,值可以是“wait”、“ok”、“2edit”或“no”,因此我使用“SELECT*FROM table ORDER BY field(request_STATUS”、“wait”、“2edit”、“ok”、“no”)获取值

到目前为止还不错。但是我需要有STATUS=“wait”的结果才能符合日期顺序。可能吗

我希望我已经通过了这个想法


谢谢。

在按
请求状态排序后,您通常可以根据
日期对数据进行排序

SELECT * FROM table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), 
         `date`

request\u status排序后,您通常可以根据
date
对数据进行排序

SELECT * FROM table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), 
         `date`

当然这是可能的=)

看看


当然这是可能的=)

看看


类似的东西可能会起作用。if语句的第二部分无关紧要,只要它是一个日期

select * from table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
if(request_status = 'wait', date, '2013-01-01') 

类似的方法可能会奏效。if语句的第二部分无关紧要,只要它是一个日期

select * from table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
if(request_status = 'wait', date, '2013-01-01') 

只需添加第二个排序条件:

... ORDER BY
      FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
      `date`
如果您不想更改行的顺序,其中
请求\u status'wait'
,您可以这样做(但在形式上,这没有意义,因为没有order BY子句,行的顺序是正式未定义的):

…但这两种版本都不应该执行,因为这样的查询无法使用任何索引来执行
ORDER BY
子句。这是因为需要对要排序的每一行进行函数调用

相反,您应该添加一个带有适当索引的
order
字段,以及
orderby
此字段。然后您的最终查询如下所示:

... ORDER BY request_status_order, `date`
如果您希望遵守规范化最佳实践,请将您的状态提取到一个新的
status
表中。将主表与此表连接。使用所需的顺序索引作为此新表的主键

CREATE TABLE statuses (
    status_index INT NOT NULL PRIMARY KEY,
    label VARCHAR(20) NOT NULL
);

CREATE TABLE main_table (
    id INT NOT NULL PRIMARY KEY,
    `date` DATETIME NOT NULL,
    status_index INT NOT NULL,
    other_fields VARCHAR(10),
    CONSTRAINT fk_status FOREIGN KEY fk_status_idx (status_index)
        REFERENCES statuses (status_index)
);

SELECT * FROM main_table
JOIN statuses USING (status_index)
ORDER BY status_index, `date`;

只需添加第二个排序条件:

... ORDER BY
      FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
      `date`
如果您不想更改行的顺序,其中
请求\u status'wait'
,您可以这样做(但在形式上,这没有意义,因为没有order BY子句,行的顺序是正式未定义的):

…但这两种版本都不应该执行,因为这样的查询无法使用任何索引来执行
ORDER BY
子句。这是因为需要对要排序的每一行进行函数调用

相反,您应该添加一个带有适当索引的
order
字段,以及
orderby
此字段。然后您的最终查询如下所示:

... ORDER BY request_status_order, `date`
如果您希望遵守规范化最佳实践,请将您的状态提取到一个新的
status
表中。将主表与此表连接。使用所需的顺序索引作为此新表的主键

CREATE TABLE statuses (
    status_index INT NOT NULL PRIMARY KEY,
    label VARCHAR(20) NOT NULL
);

CREATE TABLE main_table (
    id INT NOT NULL PRIMARY KEY,
    `date` DATETIME NOT NULL,
    status_index INT NOT NULL,
    other_fields VARCHAR(10),
    CONSTRAINT fk_status FOREIGN KEY fk_status_idx (status_index)
        REFERENCES statuses (status_index)
);

SELECT * FROM main_table
JOIN statuses USING (status_index)
ORDER BY status_index, `date`;

+但是请注意,所有的
请求状态
es将按升序
日期
排序。不仅仅是
等待
。但是,没有其他选择。这就是答案。+但是请注意,所有
请求状态
es将按升序
日期
排序。不仅仅是
等待
。然而,没有其他选择。这是我喜欢标准化,因为这在需要性能的时候确实需要。我喜欢标准化,因为这在需要性能的时候确实需要。