2015-04-01 97 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的行上應該是不明確的。如果是這樣,邏輯會略有不同。

相關問題