我有一个带有列(id,user,flag)的日志表
表数据将类似于
id | user | flag
----------------------
1 | Tom | 1
2 | Joy | 1
3 | Tom | 2
4 | Tom | 3
5 | Tom | 2
6 | Joy | 3
7 | Tom | 4
8 | Joy | 1
问题是,如果用户在行中逐行增加值,则忽略它(这是正确的流),并且从任何点开始,flog值小于先前值,如果标志值为4,则选择它也是如此在该用户中忽略他
在表数据中,用户tom有标志(1,2,3, 2 ,4)我需要忽略它,因为用户的值为4且在喜悦的情况下(1, 3, 1 )我必须选择这个,因为标志在3之后有1
提前致谢。
答案 0 :(得分:0)
我不太确定我是否完全理解你的要求,尤其是应该忽略哪个标志 我相信你正在寻找这样的东西:
SELECT *
FROM table1 t1
WHERE flag < (
SELECT flag
FROM table1 t2
WHERE t2.user = t1.user
AND t2.id < t1.id
ORDER BY id desc
LIMIT 1
)
演示:http://sqlfiddle.com/#!9/ecdd18/5
| id | user | flag |
|----|------|------|
| 5 | Tom | 2 |
| 8 | Joy | 1 |
答案 1 :(得分:0)
将一行中的值与前一行的值进行比较的方法是使用用户定义的变量,如where @flag < flag
。解决方案相当容易。但是,在您的情况下,还需要考虑同一用户的值。这使得查询变得更加复杂,但是在这里:
set @user='', @flag:= 0;
select final.id, final.user, final.flag
from (select *, @user := user as userTemp, @flag := flag as flagTemp
from (select * from sometable order by user) oByUser
where
(@user = user and @flag < flag) OR
(@user <> user)) final
order by id
我使用了从您的演示数据派生的以下架构:
CREATE TABLE sometable (`id` int, `user` varchar(3), `flag` int);
INSERT INTO sometable (`id`, `user`, `flag`) VALUES
(1, 'Tom', 1),
(2, 'Joy', 1),
(3, 'Tom', 2),
(4, 'Tom', 3),
(5, 'Tom', 2),
(6, 'Joy', 3),
(7, 'Tom', 4),
(8, 'Joy', 1);
然后,应用查询会产生以下结果:
id|user|flag
1 |Tom |1
2 |Joy |1
3 |Tom |2
4 |Tom |3
6 |Joy |3
7 |Tom |4