我有一个问题是找出从表中最后一个标记值后抓取行的方法。
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
答案 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
的行上。如果是这样,那么逻辑就会略有不同。