MySQL在行之间选择行

时间:2013-12-24 15:05:31

标签: mysql sql select between

我一直坚持表达,因为我甚至没想到如何做到这一点:

示例表(忽略rotid,不使用)

 id  ------   trackid    -----rotid-----userid-----actid

1159 ------ 108980421888 ------ 48 ------  1  ------ 21
1160 ------ 108980421888 ------ 48 ------ 917 ------ 2     
1161 ------ 108980421888 ------ 48 ------ 918 ------ 3     - in result
1162 ------ 108980421888 ------ 48 ------ 919 ------ 4     
1163 ------ 108980421888 ------ 48 ------ 920 ------ 5
1164 ------ 108980421888 ------ 48 ------ 921 ------ 4
1165 ------ 108980421888 ------ 48 ------ 922 ------ 6
1166 ------ 108980421888 ------ 48 ------ 917 ------ 4
1167 ------ 108980421888 ------ 48 ------ 918 ------ 6
1168 ------ 108980421888 ------ 48 ------  1  ------ 7
1169 ------ 108980421888 ------ 48 ------ 918 ------ 8
1170 ------ 108980421888 ------ 48 ------ 920 ------ 5
1171 ------ 108980421888 ------ 48 ------ 922 ------ 4
1172 ------ 108980421888 ------ 48 ------ 918 ------ 5
1173 ------ 108980421888 ------ 48 ------ 920 ------ 6
1174 ------ 108980421888 ------ 48 ------  1  ------ 9
1175 ------ 108980421888 ------ 48 ------  1  ------ 19
1176 ------ 108980421888 ------ 48 ------ 918 ------ 12
1177 ------ 108980421888 ------ 48 ------ 920 ------ 12
1178 ------ 108980421888 ------ 48 ------  1  ------ 15

我需要选择所有行:trackid = trackid,在actid = 21之后和FIRST actid = 5之前。 ACTID = 3。带有idiential trackid的行数据包汇集在一起​​。 Actid = 21始终是行数据包中的第一个。 Actid = 5总是以行包形式出现。有时它可能是第一行actid = 21和第二行actid = 5。我们不知道确切的trackid(trackid =?)。

换句话说:我们需要选择actid = 3的所有行,但是在actid = 21之后和actid = 5之前,使用相同的trackid选择。

第二个查询是相同的,但我们知道确切的用户ID。

感谢您提前!

1 个答案:

答案 0 :(得分:1)

对于您问题中的数据:

select t.*
from table t join
     (select trackid, min(case when actid = 21 then id end) as id21,
             min(case when actid = 5 then id end) as id5
      from table t
      group by trackid
     ) tlim
     on t.id > tlim.id21 and t.id < tlim.id5
order by id;

这会找到trackid为21和5的每个actid的最小ID,并选择中间的行。