现在我有一个表,里面记录了产品的测量数据,一次测量会产生多个项(如电流,电压和频率),但是一组数据的测量日期是一样的。基本如下产品编号 测试项 数据 测试日期
-----------------------------------------------
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

解决方案 »

  1.   


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

  2.   

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

  3.   

    谢谢,我现在有40000条数据,电脑是普通的PC,没建立索引,执行需要3.3秒select * from 一个表 a where not exists (select 1 from 一个表 where 产品编号=a.产品编号 and 测试项=a.测试项 and 测试日期>a.测试日期)这语句我有些不明白,为什么要SELECT 1呢?
    本质是不是相当于做了一个自连接,然后选择出日期最大的数据?
      

  4.   

    select 什么都没关系,不过是个常量,这样MYSQL只需要在索引中查询就行了。不需要去访问数据文件。关键是exists结果相同,本质不同。
      

  5.   

    索引会以前匹配来选择。如果你的索引1 (产品编号,测试项,测试日期)当你 where 产品编号='xxxx' 则可以用这个 索引1
    当你 where 产品编号='xxxx' and 测试项 =yyy 可以用这个 索引1
    当你 where 测试项 =yyy 则无法使用 索引1