首页 > 解决方案 > 对于 MySQL 中提到的示例,我应该使用循环还是任何其他替代方法

问题描述

示例表 1 在此处输入图像描述

示例表 2 在此处输入图像描述

示例表 3 在此处输入图像描述

我们目前有一个按 customer_id 分组的查询,一个客户可能有多个 booking_id,每个 booking_id 都有自己的跟踪器,可以是 Facebook 安装、Instagram 安装或有机我们需要创建一个新列作为预期输出,它检查是否对于客户的每次预订,所有跟踪器都是有机的,那么预期输出中的每一行对于该客户也是有机的。但是,如果预订的跟踪器包含 Facebook 安装或 Instagram 安装,并且之后的预订对于同一客户来说是有机的,如示例表 1 所示,那么预期输出应该是 Facebook 和 Instagram 安装的预订应该保持不变,但预订是有机的应该被分配它上面的预订跟踪器的名称,即 Instagram 安装,如示例表 1 所示。

没有程序的可能解决方案。

标签: mysql

解决方案


使用合并和子查询来获取上一个或下一个非有机的

DROP TABLE IF EXISTS T;
CREATE TABLE T
(ID INT AUTO_INCREMENT PRIMARY KEY,CID INT,TRACKER VARCHAR(20));

INSERT INTO T(CID,TRACKER) VALUES
(1,'F'),(1,'I'),(1,'O'),
(2,'O'),(2,'F'),(2,'I'),
(3,'O'),(4,'F'),
(5,'F'),(5,'I'),(5,'O'),(5,'I'),(5,'F'),(5,'O'),(5,'F');


SELECT T.*,
       CASE WHEN T.TRACKER  = 'O' THEN
        COALESCE(
          (SELECT C.TRACKER FROM T C WHERE C.CID = T.CID AND C.ID < T.ID ORDER BY C.CID,C.ID DESC LIMIT 1),
          (SELECT C.TRACKER FROM T C WHERE C.CID = T.CID AND C.ID > T.ID ORDER BY C.CID,C.ID LIMIT 1),
          T.TRACKER
          )
          ELSE T.TRACKER
          END TRACKER
FROM T 
ORDER BY CID,ID;

+----+------+---------+---------+
| ID | CID  | TRACKER | TRACKER |
+----+------+---------+---------+
|  1 |    1 | F       | F       |
|  2 |    1 | I       | I       |
|  3 |    1 | O       | I       |
|  4 |    2 | O       | F       |
|  5 |    2 | F       | F       |
|  6 |    2 | I       | I       |
|  7 |    3 | O       | O       |
|  8 |    4 | F       | F       |
|  9 |    5 | F       | F       |
| 10 |    5 | I       | I       |
| 11 |    5 | O       | I       |
| 12 |    5 | I       | I       |
| 13 |    5 | F       | F       |
| 14 |    5 | O       | F       |
| 15 |    5 | F       | F       |
+----+------+---------+---------+
15 rows in set (0.002 sec)

推荐阅读