mysql - 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) $$
是否可以修复该示例查询来完成这项工作?
解决方案
您应该将您的字段小时、分钟和秒转换为日期格式,如下所示:
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
推荐阅读
- asp.net-mvc - 如何从受保护的视频 URL 播放 HTML 视频
- google-api - 面对 HttpRequest setResponseReturnRawInputStream 的 NoSuchMethodError
- sql - 加入子查询不工作“别名问题”-Postgres
- python - 熊猫无法在一夜之间打开 csv 文件
- r - 如何将行名设置为数据框列表中的列?
- jquery - 即使在滚动时也使元素跟随光标位置
- python - python列表仅在使用列表理解完全匹配时才替换
- javascript - 在哪里/如何进行单元测试和 xstate 保护功能?
- linux - QEMU 自动退出
- vue.js - Vue / Nuxt - 如何在视频元素中显示“海报”