求一个SQL语句

varlj 2009-12-24 01:58:14
现在我有一个表,里面记录了产品的测量数据,一次测量会产生多个项(如电流,电压和频率),但是一组数据的测量日期是一样的。基本如下

产品编号 测试项 数据 测试日期
-----------------------------------------------
1 电流 10.3 2009-12-12 10:00:00
1 电压 3.5 2009-12-12 10:00:00
1 频率 50 2009-12-12 10:00:00
2 电流 11.3 2009-12-12 21:00:00
2 电压 3.8 2009-12-12 21:00:00
2 频率 49 2009-12-12 21:00:00
1 电流 1.9 2009-12-11 12:00:00
1 电压 3.4 2009-12-11 12:00:00
1 频率 43 2009-12-11 12:00:00

当一个产品不合格的时候,就会去多次测量,然后把数据再次写入这个表,比如1号,就测量了两次
当要导出数据的时候,我只需要最新的测量数据即可(即测试日期靠后的数据)

产品编号 测试项 数据 测试日期
1 电流 10.3 2009-12-12 10:00:00
1 电压 3.5 2009-12-12 10:00:00
1 频率 50 2009-12-12 10:00:00
2 电流 11.3 2009-12-12 21:00:00
2 电压 3.8 2009-12-12 21:00:00
2 频率 49 2009-12-12 21:00:00

现在我的问题是,有没有比较好的方式,可以快速的取到这些数据?
我的数据库是My SQL 5.1.30-community
...全文
63 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2009-12-24
  • 打赏
  • 举报
回复
[Quote]对于产品编号,测试项,测试日期,也经常需要作为单独的条件来查询,是建立一个复合索引就可以了呢,还是还要为这有一个,建立单独的索引?[/Quote]索引会以前匹配来选择。

如果你的索引1 (产品编号,测试项,测试日期)

当你 where 产品编号='xxxx' 则可以用这个 索引1
当你 where 产品编号='xxxx' and 测试项 =yyy 可以用这个 索引1
当你 where 测试项 =yyy 则无法使用 索引1
varlj 2009-12-24
  • 打赏
  • 举报
回复
还有点小疑惑,对于产品编号,测试项,测试日期,也经常需要作为单独的条件来查询,是建立一个复合索引就可以了呢,还是还要为这有一个,建立单独的索引?
varlj 2009-12-24
  • 打赏
  • 举报
回复
谢谢,突然间明白了
建立索引后,用了0.878秒
再加上一系列的条件后,可以达到0.2秒左右,可以接受了
ACMAIN_CHM 2009-12-24
  • 打赏
  • 举报
回复
[Quote]这语句我有些不明白,为什么要SELECT 1呢?[/Quote]
select 什么都没关系,不过是个常量,这样MYSQL只需要在索引中查询就行了。不需要去访问数据文件。关键是exists

[Quote]本质是不是相当于做了一个自连接,然后选择出日期最大的数据?[/Quote]
结果相同,本质不同。
varlj 2009-12-24
  • 打赏
  • 举报
回复
谢谢,我现在有40000条数据,电脑是普通的PC,没建立索引,执行需要3.3秒

select * from 一个表 a where not exists (select 1 from 一个表 where 产品编号=a.产品编号 and 测试项=a.测试项 and 测试日期>a.测试日期)

这语句我有些不明白,为什么要SELECT 1呢?
本质是不是相当于做了一个自连接,然后选择出日期最大的数据?

ACMAIN_CHM 2009-12-24
  • 打赏
  • 举报
回复
建议创建复合索引 (产品编号,测试项,测试日期)
ACMAIN_CHM 2009-12-24
  • 打赏
  • 举报
回复
select *
from 一个表 a
where not exists (select 1 from 一个表
where 产品编号=a.产品编号 and 测试项=a.测试项
and 测试日期>a.测试日期)
阿_布 2009-12-24
  • 打赏
  • 举报
回复

select * from tablename t1 where not exists
(select 1 from tablename where 产品编号=t1.产品编号 and 测试日期>t1.测试日期);

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧