MySQL находит в базе данных, где значение в массиве в JSON находится МЕЖДУ чем-то

у меня есть база данных

пользователь Информация 0 {"messages": [{"user_to": 1, "timestamp": 1663000000}, {"user_to": 2, "timestamp": 1662000000}]} 1 {"messages": [{"user_to": 0, "timestamp": 1661000000}, {"user_to": 2, "timestamp": 1660000000}]} 2 {"Сообщения": []}

И я хочу выбрать всех пользователей, которые отправили сообщения между отметками времени 1662000000 и 1663000000 (любое количество сообщений, а не все)

У меня нет внешней таблицы сообщений, поэтому я не могу выбрать оттуда

Разберите с помощью JSON_TABLE(), затем проверьте.

Akina 13.09.2022 11:06

Каждое сообщение имеет только две метки времени?

lucumt 13.09.2022 11:38

Каждое сообщение имеет только одну метку времени, например, пользователь отправил два сообщения с метками времени 1663000000 и 1662000000.

HeyThereAmI 13.09.2022 12:03

Содержит ли каждый массив «сообщения» не более двух элементов с отдельными временными метками сообщений? Или, может быть, существует какой-то верхний предел, отличный от 2?

Akina 13.09.2022 12:06

Вы говорите, что у вас нет таблицы сообщений, но контролируете ли вы ее? Потому что это действительно должно быть заменено таблицей сообщений, если вы собираетесь использовать реляционную базу данных.

Jerry 13.09.2022 12:12

Сообщений может быть сколько угодно

HeyThereAmI 13.09.2022 12:12

@HeyThereAmI, из любопытства, почему вы решили использовать JSON для массива сообщений? Если бы вы хранили сообщения в отдельной таблице, по одному сообщению в строке, запросы к ним были бы намного проще.

Bill Karwin 13.09.2022 18:09
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете MySQL v8.0.x, вы можете использовать JSON_TABLE для создания форматированной таблицы JSON в подзапросе. Затем выберите своих пользователей DISTINCT, используя метку времени в предложении WHERE следующим образом:

SELECT DISTINCT b.`user` FROM (
      SELECT `user`, a.*
      FROM `sample_table`, 
      JSON_TABLE(`info`,'$'
           COLUMNS (
              NESTED PATH '$.messages[*]'
                COLUMNS (
                  `user_to` int(11)  PATH '$.user_to',
                  `timestamp` int(40) PATH '$.timestamp')
                   )
                ) a
              ) b
WHERE b.`timestamp` BETWEEN 1662000000 AND 1663000000
ORDER BY b.`user` ASC

Вход:

пользователь Информация 0 {"messages": [{"user_to": 1, "timestamp": 1663000000}, {"user_to": 2, "timestamp": 1662000000}]} 1 {"messages": [{"user_to": 0, "timestamp": 1661000000}, {"user_to": 2, "timestamp": 1660000000}]} 2 {"Сообщения": []} 3 {"messages": [{"user_to": 0, "timestamp": 1662000000}, {"user_to": 2, "timestamp": 1661000000}, {"user_to": 2, "timestamp": 1660000000}, {" user_to": 2, "отметка времени": 1663000000}]}

Вывод:

пользователь 0 3

db<>рабочий пример здесь

Другие вопросы по теме