如何找到嵌套 Json 之间的时间

How to find a time between nested Json

我创建了一个名为 ticket_manager 的 table,结构如下:

每次扫描基于用户的 QR 码时,它都会添加一个新行(无论是签到时,它都会向“checkIn with "check_in_$count" 或使用“check_out_$count”结帐的新行 -> 例如 "check_in_0 is a pair with "check_out_0"so..
p1 -​​> 2:00 - 4:00am; 10:00 - 11:00 上午
p2 -> 3:00 - 4:00am;
p3 -> 9:00 - 9:30am

现在我想进行 MYSQL 查询以查找在特定时间(例如:03:00:00 am05:00:00 am 之间发生事件的所有人。

我真的不知道遍历 json(并将它们配对)的最佳方法。
到目前为止我知道 :
SELECT * FROM "wp_ticket_manager" WHERE "event_logs" BETWEEN '31.07.2021 03:00:00' AND '31.07.2021 05:00:00
获取正常字段之间的所有查询(没有对和 json)
SELECT * FROM "wp_ticket_manager" WHERE JSON_EXTRACT(event_logs, '$.checkIn.check_in_0') BETWEEN '31.07.2021 03:00:00' AND '31.07.2021 05:00:00'
检查特定字段(但没有用)
我是否应该更改 table 布局以使其更容易?

示例数据:
mysql 版本 15.1 Distrib 10.4.18-MariaDB

CREATE TABLE IF NOT EXISTS `ticket_manager` (
            `id` int(11) unsigned NOT NULL auto_increment,
            `attendee_name` VARCHAR (255) NOT NULL, 
            `event_logs` text,
            PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

INSERT INTO `ticket_manager` (id, attendee_name, event_logs)
VALUES (1,'p1','{"checkIn":{"check_in_0":" 31.07.2021 02:00:00 am","check_in_1":" 31.07.2021 10:00:00 am"},"checkOut":{"check_out_0":" 31.07.2021 04:00:00 am","check_out_1":" 31.07.2021 11:00:00 am"}}'), (2,'p2','{"checkIn":{"check_in_0":" 31.07.2021 03:00:00 am",},
"checkOut":{"check_out_0":" 31.07.2021 04:00:00 am"}}'), (3,'p3','{"checkIn":{"check_in_0":" 31.07.2021 9:00:00 am",},
"checkOut":{"check_out_0":" 31.07.2021 9:30:00 am"}}');

(期望的输出将是请求中特定时间之间的所有查询)

使用以下方法解析您的数据:

WITH RECURSIVE
cte AS ( SELECT id, attendee_name, event_logs, 
                0 level,
                JSON_EXTRACT(event_logs, CONCAT('$.checkIn.check_in_0')) check_in,
                JSON_EXTRACT(event_logs, CONCAT('$.checkOut.check_out_0')) check_out
         FROM ticket_manager
         UNION ALL
         SELECT id, attendee_name, event_logs, 
                1 + level,
                JSON_EXTRACT(event_logs, CONCAT('$.checkIn.check_in_', 1 + level)) check_in,
                JSON_EXTRACT(event_logs, CONCAT('$.checkOut.check_out_', 1 + level)) check_out
         FROM cte
         HAVING check_in )

https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=8f0974105b67a2606ea920ea0943c772

然后使用提取的 check_incheck_out 值(注意 - 它们的格式不正确 MySQL/MariaDB 的 DATETIME 格式)。