首页 > 解决方案 > Mysql按多列选择顺序

问题描述

下面的脚本创建一个简单的数据库和表。在 windows 环境中,您可以将它与 wamp 服务器的 ( https://sourceforge.net/projects/wampserver/ ) phpmyadmin sql 控制台一起使用:

delimiter $$

create database testtimes $$
use testtimes $$

create table mytime (
 hour bigint not null,
 min varchar(3) not null,
 sec bigint not null,
 unique key mytime_lst (hour,min,sec)
 ) $$

insert into mytime (hour,min,sec) values (0,"3",10) $$
insert into mytime (hour,min,sec) values (0,"3",11) $$
insert into mytime (hour,min,sec) values (0,"4",8) $$
insert into mytime (hour,min,sec) values (0,"5",3) $$
insert into mytime (hour,min,sec) values (1,"0",7) $$
insert into mytime (hour,min,sec) values (1,"3",10) $$

delimiter ;

在简化示例中,有 3 列和一些行。列作为一个逻辑单元捆绑在一起,我在它们上创建了索引。我想查明表中的 1 个逻辑单元,并使用索引在该点旁边给我 2 个结果。我不确定,我是否有这种支持。如果问题与特定的 SQL 服务器有关,请给我提示。

(为了防止不相关的问题:将“min”列故意转换为varchar。上面的例子是一个简化的例子。在实际环境中,我没有奢侈只依赖bigints。)

一个示例查询:

select *
from mytime
where (hour >= 0 and min >= "4" and sec >= 7)
order by hour, min, sec asc
limit 2

当我运行上面的查询时(phpmyadmin 有帮助),它只返回插入的行:

insert into mytime (hour,min,sec) values (0,"4",8) $$

我也想找回这一行:

insert into mytime (hour,min,sec) values (0,"5",3) $$

是否可以修复该示例查询来完成这项工作?

标签: mysqlsql

解决方案


您应该将您的字段小时、分钟和秒转换为日期格式,如下所示:

SELECT * FROM mytime 
WHERE STR_TO_DATE(CONCAT(hour,'-',min,'-',sec),'%H-%i-%s') > '00:04:07'
ORDER BY hour,min,sec asc limit 2

如果您愿意,您甚至可以使用 > '0:4:7'

或者

SELECT * FROM mytime 
WHERE CONVERT(CONCAT(hour,':',min,':',sec), TIME) > '0:4:7'
ORDER BY hour,min,sec ASC LIMIT 2

如果您不想使用 str_to_date 和 concat 转换为日期,则可以使用带有 OR 的多个 where 子句,如下所示:

SELECT *
FROM mytime
WHERE (HOUR > 0)
OR (HOUR = 0 AND min > 4)
OR (HOUR = 0 AND min = 4 AND SEC >= 7)
ORDER BY hour, min, sec asc
LIMIT 2

推荐阅读