Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 显示与特定事件最近的数据的SQL查询_Php_Mysql_Sql - Fatal编程技术网

Php 显示与特定事件最近的数据的SQL查询

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

我试图找出如何编写一个MySQL查询,它将返回最近的数据,Actor=210表示E_id=3

这是我的原始表格:

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中测试了我的示例,它按预期工作。我不知道你在说什么:正确的答案是什么?请不要加上“谢谢”。取而代之的是,投票选出你认为有用的答案。