mysql查询获取列表上最后一个特定标记后的行

时间:2015-04-01 10:47:25

标签: mysql sql

我有一个问题是找出从表中最后一个标记值后抓取行的方法。

id  | f_id    | pi         | typeId
 1  |   1     | 10         | 1
 2  |   2     | 24         | 2
 3  |   1     | 34         | 3
 4  |   1     | 56         | 2
 5  |   1     | 12         | 1
 6  |   2     | 34         | 1
 7  |   1     | 65         | 1
 8  |   1     | 19         | 2
 9  |   1     | 38         | 1
 10 |   2     | 27         | 3
 11 |   1     | 21         | 3

我需要一个mysql查询f_id = 1和最后一个typeId = 2之后的行(包括typeId = 2行),如下所示:

  id  | f_id    | pi         | typeId
   1  |  1      | 19         | 2
   2  |  1      | 38         | 1
   3  |  1      | 21         | 3

3 个答案:

答案 0 :(得分:1)

考虑以下

mysql> create table test (f_id int, pi int, typeid int,timestamp datetime);
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test values 
    -> (1,10,1, date_add(now(),interval 1 minute)),
    -> (2,24,2, date_add(now(),interval 2 minute)),
    -> (1,34,3,date_add(now(),interval 3 minute)),
    -> (1,56,2,date_add(now(),interval 4 minute)),
    -> (1,12,1,date_add(now(),interval 5 minute)),
    -> (2,34,1,date_add(now(),interval 6 minute)),
    -> (1,65,1,date_add(now(),interval 7 minute)),
    -> (1,19,2,date_add(now(),interval 8 minute)),
    -> (1,38,1,date_add(now(),interval 9 minute)),
    -> (2,27,3,date_add(now(),interval 10 minute)),
    -> (1,21,3,date_add(now(),interval 11 minute));
Query OK, 11 rows affected (0.08 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> select * from test ;
+------+------+--------+---------------------+
| f_id | pi   | typeid | timestamp           |
+------+------+--------+---------------------+
|    1 |   10 |      1 | 2015-04-01 16:53:01 |
|    2 |   24 |      2 | 2015-04-01 16:54:01 |
|    1 |   34 |      3 | 2015-04-01 16:55:01 |
|    1 |   56 |      2 | 2015-04-01 16:56:01 |
|    1 |   12 |      1 | 2015-04-01 16:57:01 |
|    2 |   34 |      1 | 2015-04-01 16:58:01 |
|    1 |   65 |      1 | 2015-04-01 16:59:01 |
|    1 |   19 |      2 | 2015-04-01 17:00:01 |
|    1 |   38 |      1 | 2015-04-01 17:01:01 |
|    2 |   27 |      3 | 2015-04-01 17:02:01 |
|    1 |   21 |      3 | 2015-04-01 17:03:01 |
+------+------+--------+---------------------+
11 rows in set (0.00 sec)

查询将首先通过timestamp列获得第一个条件排序的结果,并且第一个记录之后的union all将获得其余的结果

(  
  select * from test where f_id = 1 and typeid = 2 order by timestamp desc limit 1
)
union all
(
  select * from test t1 where t1.f_id = 1 and t1.timestamp > ( select max(timestamp) from test t2 where t2.f_id = 1 and t2.typeid = 2 )
) ;

结果将是

+------+------+--------+---------------------+
| f_id | pi   | typeid | timestamp           |
+------+------+--------+---------------------+
|    1 |   19 |      2 | 2015-04-01 17:00:01 |
|    1 |   38 |      1 | 2015-04-01 17:01:01 |
|    1 |   21 |      3 | 2015-04-01 17:03:01 |
+------+------+--------+---------------------+

答案 1 :(得分:0)

试试这个。 Myabe帮助你:

select id, max(f_id), max(pi), max(typeId)
    from TABLE
    where f_id=1 and typeID=1
    group by id
    order by max(f_id)

答案 2 :(得分:0)

您可以通过从

表中获取最大join来将其表示为id
select t.*
from table t cross join
     (select max(id) as maxid
      from table
      where typeId = 2
     ) t2
where t.id = t2.id or
      (t.id > t2.id and t.f_id = 1)

这回答了我理解的问题 - &#34; 2&#34;值可以在任何行上,并且您希望该行返回,即使它是f_id <> 1。关于&#34; 2&#34;是否含糊不清。值应位于f_id = 1的行上。如果是这样,那么逻辑就会略有不同。