2015-04-01 95 views
1

我有一个问题,以找出最后一个表格中标记的值之后的格式化行的方式。mysql查询获取列表上的最后一个特定标记后的行

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 

我需要的f_id = 1和最后TYPEID = 2(包括TYPEID = 2行)后的行像以下MySQL查询:

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

你怎么知道最后一项是否有主键或时间戳? – 2015-04-01 10:51:50

+0

有时间戳,我没有把它做成凌乱/令人困惑的表。假设列表根据输入时间。 – aliaktas 2015-04-01 11:04:29

回答

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) 

查询将首先通过时间戳列的第一个条件排序和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 | 
+------+------+--------+---------------------+ 
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) 
0

您可以从表中获得最大的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) 

表达这种join这回答我的理解这个问题 - 这里的“2”值可以在任何行上,并且即使它的行号为f_id <> 1,也要返回该行。关于“2”值是否在f_id = 1的行上应该是不明确的。如果是这样,逻辑会略有不同。

相关问题