【问题标题】:How to find a time between nested Json如何在嵌套的 Json 之间找到时间
【发布时间】:2021-10-08 13:46:26
【问题描述】:

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

每次扫描基于用户的二维码时,它都会添加一个新行(当它是签到时,它会在“checkIn”中添加一个新行,或者在“checkOut”中添加一个新行check_out_$count" -> 例如"check_in_0 is a pair with "check_out_0"so..
p1 -​​> 凌晨 2:00 - 凌晨 4:00;上午 10:00 - 11:00
p2 -> 凌晨 3:00 - 凌晨 4:00;
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'
检查特定字段(但没有用)
我应该更改表格布局以使其更容易吗?

示例数据:
mysql Ver 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"}}');

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

【问题讨论】:

  • 以 CREATE TABLE + INSERT INTO 形式提供样本数据以及该数据的所需输出。还要指定精确 MySQL 版本。
  • 我已经添加了数据。谢谢你的建议:)

标签: php mysql json mariadb nested-queries


【解决方案1】:

使用以下示例解析您的数据:

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 格式不正确)。

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多