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

时间:2013-06-28 15:03:32

标签: php mysql

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

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

到目前为止一切顺利。但是我需要具有STATUS =“wait”的结果,处于DATE顺序。有可能吗?

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

谢谢。

4 个答案:

答案 0 :(得分:3)

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

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

如果你不想改变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`;

答案 1 :(得分:1)

date

排序后,您通常可以根据request_status对数据进行排序
SELECT * FROM table 
ORDER BY FIELD(request_status, 'wait', '2edit', 'ok', 'no'), 
         `date`

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

SQL Fiddle