Php 显示与特定事件最近的数据的SQL查询
我试图找出如何编写一个MySQL查询,它将返回最近的数据,Actor=210表示E_id=3 这是我的原始表格:Php 显示与特定事件最近的数据的SQL查询,php,mysql,sql,Php,Mysql,Sql,我试图找出如何编写一个MySQL查询,它将返回最近的数据,Actor=210表示E_id=3 这是我的原始表格: Session Player E_id Time Actor PosX PosY index ------------------- ------ ---- ----------------------- ----- ---- ---- ----- 23131885ccc560bb6c8 10
Session Player E_id Time Actor PosX PosY index
------------------- ------ ---- ----------------------- ----- ---- ---- -----
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 906 466 6
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 342 540 7
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 31 812 244 8
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 248 614 9
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 21 342 688 10
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 49 812 170 11
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 50 248 466 12
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 718 318 13
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 52 154 466 14
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 211 499 250 15
23131885ccc560bb6c8 10125 3 01-11-2012 08:56:40.63 208 510 414 16
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 248 466 17
23131885ccc560bb6c8 10125 15 01-11-2012 08:56:38.323 20 718 318 18
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 52 154 466 19
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 11 499 250 20
23131885ccc560bb6c8 10125 3 01-11-2012 08:56:40.63 208 510 414 21
如果我提出质询
select * from table where E_id = 3 or Actor = 210;
我得到这个结果
Session Player E_id Time Actor PosX PosY index
------------------- ------ ---- ----------------------- ----- ---- ---- -----
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 906 466 6
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 342 540 7
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 248 614 9
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 718 318 13
23131885ccc560bb6c8 10125 3 01-11-2012 08:56:40.63 208 510 414 16
23131885ccc560bb6c8 10125 17 01-11-2012 08:56:38.323 210 248 466 17
23131885ccc560bb6c8 10125 3 01-11-2012 08:56:40.63 208 510 414 21
预期结果是:
索引号为13的行用于索引号为16的行,以及
索引为17的行用于索引为21的行
索引16和21两个e_id都是3您的输入是e_id、索引和参与者。索引似乎是唯一的列,所以您不需要E_ID 此查询将按索引距离查找最近的。但它将只查找索引较低的行
select *
from your_tbl
where 16 - `index` >= 0 and Actor = 210
order by 16 - `index`
limit 1
16给13,21给17
还有一个查询没有只查找的限制。它将找到最接近的索引:
select *
from your_tbl
where Actor = 210
order by abs(21 - `index`)
limit 1
我提出两个问题,因为我不明白这个问题中“最近距离”是什么意思。如果它在索引距离absindex1-index2方面是最近的,那么对于16,17的结果与13一样好,因为它们都有Actor=210,并且它们是相邻的。这意味着使用工会,但这不是最好的。埃格亚尔的小提琴功劳 查询:
select session, player, e_id,
time, actor, max(`index`)
from your_tbl
where Actor = 210
union
select session, player, e_id,
time, actor, `index`
from your_tbl
where e_id = 3
;
| SESSION | PLAYER | E_ID | TIME | ACTOR | MAX(`INDEX`) |
------------------------------------------------------------------------------------------
| 23131885ccc560bb6c8 | 10125 | 17 | January, 11 2012 08:56:38 | 210 | 17 |
| 23131885ccc560bb6c8 | 10125 | 3 | January, 11 2012 08:56:40 | 208 | 16 |
| 23131885ccc560bb6c8 | 10125 | 3 | January, 11 2012 08:56:40 | 208 | 21 |
我真的不知道是否真的需要第3个or语句,但如果你的应用程序可能会将其作为特例使用,你可以根据自己的意愿删除它。如果要删除我使用的额外行,请将其更改为:
select `Session`, `Player`, `E_id`, `Time`, `Actor`, `PosX`, `PosY`, `index` ...
我没有包括它,因为[`]在PHP中并不总是受欢迎的
set @i = 0;
set @j = 0;
set @k = 0;
set @l = 0;
select * from (select *, @i:=@i+1 as myrow from your_tbl where E_id = 3 or Actor=210) as tb1
where myrow in
(select myrow2-1 from
(select *, @j:=@j+1 as myrow2 from your_tbl where E_id = 3 or Actor=210) as tb2
where E_id=3) or myrow in
(select myrow3+1 from
(select *, @k:=@k+1 as myrow3 from your_tbl where E_id = 3 or Actor=210) as tb3
where E_id=3) or myrow in
(select myrow4 from
(select *, @l:=@l+1 as myrow4 from your_tbl where E_id = 3 or Actor=210) as tb4
where E_id=3)
我通过@eggyal示例获得ans,当我得到最终查询时,它非常简单closest@ShivaKomuravelly最近的数据参与者=210@Nileshpatel-你能发布你的预期结果吗?@Nileshpatel如果是oracle,那么我可以告诉你这个解决方案:首先根据索引对它们进行排序,然后比较超前和滞后值他们需要什么就用什么。基本上,lead会给出上面一行的结果,lag会给出下一行的结果。@Shivakomurally这是MYSQL,顺便说一下,这是示例代码,我有很多类似于这种类型的数据,不仅有两行e_id=3i,我没有任何具体的距离,我得到的actor是210。我需要找到,如果e_id=3,那么哪一个是最近的数据,哪一个是210,索引是自动递增的。将@your_索引替换为16,查询将返回索引为13的行。例如,索引13的行是索引16的行的结果,所以这是正确的。当@your_index=16时,它将返回索引为13的行。您的_索引将不会得到结果,因为他的输入索引从未包含Actor=210。我在MS SQL中测试了我的示例,它按预期工作。我不知道你在说什么:正确的答案是什么?请不要加上“谢谢”。取而代之的是,投票选出你认为有用的答案。