1

E_id = 3 で Actor = 210 の最も近いデータを返す MySQL クエリを作成する方法を見つけようとしています。

これは私の元のテーブルです:

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_id3

4

4 に答える 4

0

入力は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

質問の中で最も近いとはどういう意味かわからないので、2つの質問をします。インデックス距離abs(index1-index2)の観点から最も近い場合、16の場合17は、両方ともActor = 210であり、隣接しているため、13と同じくらい良い結果になります。

于 2013-01-16T05:29:58.153 に答える
0

これは非動的な答えです。それは a を使用することを意味し、unionそれは最善ではありません。(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 の例で ans を取得します

于 2013-01-16T08:49:43.043 に答える