如何找到嵌套 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 am
到 05: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_in
和 check_out
值(注意 - 它们的格式不正确 MySQL/MariaDB 的 DATETIME 格式)。
我创建了一个名为 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 am
到 05: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_in
和 check_out
值(注意 - 它们的格式不正确 MySQL/MariaDB 的 DATETIME 格式)。