1

我试图弄清楚如何编写一个 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

预期结果是: 第 16 行索引第 13 行和第 21 行索引第 17 行

索引 16 和 21 的e_id均为3

4

4 回答 4

0

您的输入是 E_ID、Index 和 Actor。索引似乎是一个唯一列,因此您不需要 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

我提出了两个问题,因为我不明白问题中最接近的意思。如果它在索引距离 abs(index1 - index2) 方面最接近,那么对于 16 17 来说,结果与 13 一样好,因为它们都有 Actor = 210 并且它们是相邻的

于 2013-01-16T05:29:58.153 回答
0

这是一个非动态的答案。这意味着使用 aunion并不是最好的。(归功于 sqlfiddle 的 Eggyal)

询问:

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 |
于 2013-01-16T07:25:04.730 回答
0

这是它有效的测试

我真的不知道是否真的需要第 3 个或语句,但如果您的应用程序可能将其用作特殊情况,您可以根据需要删除它。如果要删除我使用的额外行,而不是select *在变量赋值之后,将其更改为:

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)
于 2013-01-16T07:56:45.470 回答
-1

我通过@eggyal 示例解决方案得到我的答案当我得到最终查询时它是如此简单

于 2013-01-16T08:49:43.043 回答