1

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

在 STATUS 字段中,值可以是“wait”、“ok”、“2edit”或“no”,因此要获取值,我使用“SELECT * FROM table ORDER BY FIELD(request_status, 'wait', '2edit', '好的','不')”

到目前为止,一切都很好。但我需要 STATUS = "wait" 的结果按 DATE 顺序排列。可能吗?

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

谢谢你。

4

4 回答 4

3

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

... ORDER BY
      FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
      `date`

如果您不想更改 where 行的顺序request_status <> 'wait',您可以这样做(但从形式上讲,这没有意义,因为在没有 ORDER BY 子句的情况下,行的顺序是官方未定义的):

... ORDER BY
      FIELD(request_status, 'wait', '2edit', 'ok', 'no'),
      IF(request_status = 'wait', `date`, 0)

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

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

... 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`;
于 2013-06-28T15:20:18.483 回答
1

您通常可以根据排序date后的数据对数据进行排序request_status

SELECT * FROM table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), 
         `date`
于 2013-06-28T15:05:43.970 回答
1

当然这是可能的 =)

看看 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

SELECT * FROM table ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), `DATE` ASC|DESC
于 2013-06-28T15:07:34.673 回答
0

这样的事情可能会奏效。if 语句的第二部分无关紧要,只要它是一个日期。

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

SQL小提琴

于 2013-06-28T15:11:58.460 回答