将每对行组合成一个MYSQL

时间:2017-11-23 18:38:14

标签: mysql sql

我写了一部分查询并且卡在了最后一部分。我到目前为止的代码:

SELECT uid, 
       x, 
       y 
FROM   (SELECT uid, 
               x, 
               y, 
               ( Timediff(Max(ts), Min(ts)) ) idle_time 
        FROM   test 
        WHERE  speed = 0 
        GROUP  BY x, 
                  y, 
                  uid 
        HAVING Count(*) > 0) t 
WHERE  idle_time > 1 
ORDER  BY uid 

结果表是:

----------------------------------
| uId | x        | y             |  
----------------------------------
| 1   | 110      | 20            |  <-- Uid = 1 start position
----------------------------------
| 1   | 220      | 50            |  <-- Uid = 1 end position
----------------------------------
| 2   | 30      | 15             |  <-- Uid = 2 start position
----------------------------------
| 2   | 40      | 22             |  <-- Uid = 2 end position
----------------------------------  

我现在需要得到的是:

------------------------------------------------------
| uId | x_start | x_end       | y _start    | y_end  |  
------------------------------------------------------
| 1   | 110      | 220        |  20         | 50     |
------------------------------------------------------
| 2   | 30      | 40         |  15          |  22    |
------------------------------------------------------

结果将始终成对出现。这意味着可以有多个具有相同uId的行,只需要添加对。我知道这并不难,任何帮助都表示赞赏!!

修改

忘记提及,END的X和Y并不总是大于START,因为使用了真实的数据库地图坐标。

1 个答案:

答案 0 :(得分:1)

没有一种漂亮的方法可以做到这一点,因为你不能在mySQL上使用CTE

首先,您需要在内部查询中返回时间戳

------------------------------------------
| uId | x       | y   | ts               |
------------------------------------------
| 1   | 110     | 20  | 2017-11-23 15:01 |
------------------------------------------
| 1   | 220     | 50  | 2017-11-23 16:11 |
------------------------------------------
| 2   | 30      | 15  | 2017-11-24 05:20 |
------------------------------------------
| 2   | 40      | 22  | 2017-11-24 11:30 |
------------------------------------------

然后您可以编写以下查询:

为简单起见,我会致电您innerQuery,因为您必须重复此代码。

SELECT q1.uid as uid
       q1.x as x_start,
       q1.y as y_start,
       q2.x as x_end,
       q2.y as y_end
FROM ( innerQuery ) as q1
JOIN ( innerQuery ) as q2
  ON q1.uid = q2.uid
 AND q1.ts < q2.ts