当行数据小于先前时,MYSQL SELECT行

时间:2016-12-30 10:31:17

标签: mysql sql

我有一个带有列(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

提前致谢。

2 个答案:

答案 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