mysql - 在 SELECT 查询之前获取行

标签 mysql

我有一个名为“mytable”的表。列是

Time_Stamp (datetime) PK
Time_stamp_ms (int) PK
data1 (int)
data2 (int)
data3 (int)
data4 (int) 
data5 (int)
data6 (int)
cycle (int)
name (varstring)

我想按 Time_Stamp 和 Time_stamp_ms 排序(我从另一个问题知道如何做到这一点)然后每次循环达到 1 时,我想从上一行获取 Time_Stamp 和 Time_Stamp_ms。循环为1,2,3,4......n表示它会一直递增1。

这个表可能有数百万行。

也没有 PHP。

有一个我的表的样本:

Time_Stamp              Time_Stamp_ms   d1      d2      d3      d4      d5      d6      cycle   name    

2014-04-24 09:09:37         765         5555    4444    3333    2222    1111    123     1       name
2014-04-24 09:09:37         845         5555    4444    3333    2222    1111    123     2       name
2014-04-24 09:09:37         925         5555    4444    3333    2222    1111    123     3       name
2014-04-24 09:09:38         5           5555    4444    3333    2222    1111    123     4       name
2014-04-24 09:09:38         85          5555    4444    3333    2222    1111    123     5       name
2014-04-24 09:09:38         165         5555    4444    3333    2222    1111    123     6       name
2014-04-24 09:09:38         245         5555    4444    3333    2222    1111    123     7       name
2014-04-24 09:09:38         325         5555    4444    3333    2222    1111    123     8       name
2014-04-24 09:09:38         405         5555    4444    3333    2222    1111    123     9       name
2014-04-24 09:09:38         485         5555    4444    3333    2222    1111    123     10      name
2014-04-24 09:09:38         565         5555    4444    3333    2222    1111    123     11      name
2014-04-24 09:09:38         645         5555    4444    3333    2222    1111    123     12      name
2014-04-24 09:09:38         725         5555    4444    3333    2222    1111    123     13      name
2014-04-24 09:09:38         805         5555    4444    3333    2222    1111    123     1       name
2014-04-24 09:09:38         885         5555    4444    3333    2222    1111    123     2       name
2014-04-24 09:09:38         965         5555    4444    3333    2222    1111    123     3       name
2014-04-24 09:09:39         45          5555    4444    3333    2222    1111    123     4       name
2014-04-24 09:09:39         125         5555    4444    3333    2222    1111    123     5       name
2014-04-24 09:09:39         205         5555    4444    3333    2222    1111    123     6       name
2014-04-24 09:09:39         285         5555    4444    3333    2222    1111    123     1       name
2014-04-24 09:09:39         365         5555    4444    3333    2222    1111    123     2       name
2014-04-24 09:09:39         445         5555    4444    3333    2222    1111    123     3       name
2014-04-24 09:09:39         525         5555    4444    3333    2222    1111    123     4       name
2014-04-24 09:09:39         605         5555    4444    3333    2222    1111    123     5       name
2014-04-24 09:09:39         685         5555    4444    3333    2222    1111    123     6       name
2014-04-24 09:09:39         765         5555    4444    3333    2222    1111    123     1       name
2014-04-24 09:09:39         845         5555    4444    3333    2222    1111    123     2       name
2014-04-24 09:09:39         925         5555    4444    3333    2222    1111    123     3       name

应该返回我:

    Time_Stamp              Time_Stamp_ms   d1      d2      d3      d4      d5      d6      cycle   name    


2014-04-24 09:09:38         725         5555    4444    3333    2222    1111    123     13      name
2014-04-24 09:09:39         205         5555    4444    3333    2222    1111    123     6       name
2014-04-24 09:09:39         685         5555    4444    3333    2222    1111    123     6       name

最佳答案

如评论中所述,您确实需要一个指示行顺序的字段。 pkey int primary key auto_increment 字段不能保证最新的行始终具有最大的 id,因此严格来说,这在 100% 的时间都不起作用。一个包含准确插入时间的列就可以了。

尽管假设(我知道是错误的),您的值字段是一个可以排序的字段,但此查询将为您获取 id=1 之前的每一行。要获得正确的结果,请创建一个按顺序排列的字段,并将 value 替换为两个 order by 子句中的该字段

更新查询:http://sqlfiddle.com/#!2/9cf7d1/1/0

SELECT Time_Stamp, Time_stamp_ms, cycle FROM (
    SELECT 
        COALESCE((@preVal=1), 0) AS afterOne, 
        m.*, 
        @preVal:=m.cycle  
    FROM mytable as m, 
    (SELECT @preVal:=NULL) AS d 
    ORDER BY Time_Stamp desc, Time_stamp_ms desc
) t 
WHERE afterOne = 1 
ORDER BY Time_Stamp, Time_stamp_ms;

一个补充说明。如果您正在处理一个大数据集,您可能会发现通过将内部查询插入临时表、索引 afterOne,然后选择最终结果来显着提高性能。 MySQL 因子查询速度慢而臭名昭著。

附言。嗯,我现在知道我可能选错了,afterOne 真的意味着在按升序排序之前。好吧,无论如何它都是一个占位符,可以命名为任何有意义的名称。

关于mysql - 在 SELECT 查询之前获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23381340/

相关文章:

mysql - 在具有内连接的位置找不到列

mysql - 将这种关系结构迁移到 Mongo 文档的最有效方法是什么?

mysql - 如何从多个select查询中获取临时表中一行的列/字段数据?

php - 目录中记录的文件名与数据库不同

php - Laravel 5 并发请求和预定作业

mysql - 多线程大量删除查询和批量插入批处理的 SQL 死锁

mysql - 每周更新数据的数据库设计

php - if 语句和 session

php - 如何将 PHPMyAdmin SQL 转储文件导入 mySQL 数据库?

php - 如何通过带有自增列的存储过程向表中插入数据