我有一个包含用户登录数据的表:
------------------------------------
| 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
匹配时停止?
答案 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的时间戳相比
答案 2 :(得分:0)
您可以使用&#34;限制&#34; MySQL中的命令:
SELECT * FROM attempts WHERE ip="12.34.56.78" AND result=0 ORDER BY timestamp DESC limit 1;
它将返回符合条件的最后一个条目。