对某些字段使用“按字段排序”,但在日期字段中保持顺序-MySQL PHP
我在MySQL中有一个表,它有两个非常重要的字段STATUS和DATE 在STATUS字段中,值可以是“wait”、“ok”、“2edit”或“no”,因此我使用“SELECT*FROM table ORDER BY field(request_STATUS”、“wait”、“2edit”、“ok”、“no”)获取值 到目前为止还不错。但是我需要有STATUS=“wait”的结果才能符合日期顺序。可能吗 我希望我已经通过了这个想法对某些字段使用“按字段排序”,但在日期字段中保持顺序-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
谢谢。在按
请求状态排序后,您通常可以根据日期对数据进行排序
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将按升序日期
排序。不仅仅是等待
。然而,没有其他选择。这是我喜欢标准化,因为这在需要性能的时候确实需要。我喜欢标准化,因为这在需要性能的时候确实需要。