选择MySQL中的最后一行并停止匹配条件

时间:2014-09-29 10:11:46

标签: mysql

我有一个包含用户登录数据的表:

------------------------------------
| ip          | timestamp | result |
------------------------------------
| 12.34.56.78 | 12345671  | 0      |
| 12.34.56.78 | 12345672  | 0      |
| 12.34.56.78 | 12345673  | 1      |
| 12.34.56.78 | 12345674  | 0      |

result=0表示登录失败,result=1表示成功。

我的目标是选择表格的最后几行result=0(按时间戳desc排序),停止第一行result=1行的选择。在显示的示例中,查询应仅返回最后一行。

我试过以下

SELECT * FROM attempts WHERE ip="12.34.56.78" AND result=0 ORDER BY timestamp DESC;

但它返回result=0的所有行(对于所需的IP)。如何修改它以在第一次result=1匹配时停止?

3 个答案:

答案 0 :(得分:1)

select
*
from
attempts
where timestamp < (select timestamp from attempts where ip='12.34.56.78' and result = 1)
and ip='12.34.56.78' and result = 0
order by timestamp desc limit 1

答案 1 :(得分:1)

您可以通过使用交叉连接来获得结果为1的最大timestamp,然后将其与外部查询的时间戳进行比较

select a.* 
from attempts a
cross join(
  select max(`timestamp`) max_time
  from attempts
  where result=1 
  and ip='12.34.56.78' 
  ) t
WHERE a.ip='12.34.56.78'
and a.result=0 
and a.timestamp > t.max_time 

我在结果0中添加了一些演示数据,并且从最后一个结果= 1行的时间戳添加了更大的时间戳,它将返回具有更大时间戳的行,结果为0,与结果为1的时间戳相比

Demo

答案 2 :(得分:0)

您可以使用&#34;限制&#34; MySQL中的命令:

SELECT * FROM attempts WHERE ip="12.34.56.78" AND result=0 ORDER BY timestamp DESC limit 1;

它将返回符合条件的最后一个条目。