@maratmd

Как задать запрос в базу mysql с массивом данных?

Только начинаю изучать mysql. Получилось сделать несколько запросов и получать на них нужные данные. Сейчас стоит немного другая и сложная для меня задача. Использую wordpress с плагином jet engine. Создал произвольный тип записи "Заказы" и определённые произвольные поля, в том числе поле репитера, так как в каждом заказе может быть от 0 до 15 сотрудников быть в работе. Поле репитера назвал sotrudniki и внутри этого поля для повтора поля "имя" и "сумма"

Вот простой запрос на получения данных:

SELECT * 
FROM zakazy

На выходе:

[0] => stdClass Object
        (
            [_ID] => 1
            [cct_status] => publish
            [zagolovok] => первая запись
            [foto] => 9116
            [god] => 2023
            [cct_author_id] => 1
            [sotrudniki] => a:2:{s:6:"item-0";a:2:{s:11:"imia";s:8:"Петя";s:12:"summa";s:3:"500";}s:6:"item-1";a:2:{s:11:"imia";s:8:"Миша";s:12:"summa";s:3:"400";}}
            [sql_query_item_id] => 103-0
        )

Понятия не имею как с этим работать. Как например мне подсчитать за 2023 год, сколько заработал Петя? Он может присутствовать в некоторых заказах, а может и нет. Порядок тоже может быть разным, сначала может идти Миша, потом Катя, потом Вася и в конце Петя.
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Понятия не имею как с этим работать.
Поскольку это даже не JSON, а сериализация средствами PHP, то единственный адекватный способ - получать все записи из БД, десериализовывать и в коде считать что нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
Философия тут простая - ВСЕ данные, которые участвуют в запросе, должны присутствовать в базе данных.

А это значит, либо данные заливать перед самим запросом во временную таблицу (что имеет смысл делать только при очень большой нужде, например большой объем данных и мало оперативной памяти на бакэнде) либо, все данные уже есть в базе, и выбирать их по идентификатору, добавляя их список в where id in (1,2,3,...)

Так же есть неплохой по моему мнению (но считается говнокодом) подход - когда данные это сам запрос, что то типа указывая данные для фильтрации по одному
select ... where name like '%sdf%' union
select .. where name like '%zxcvx%' union ...
или подготовив вложенную виртуальную таблицу с данными
select ... from (
  select 1,2,3 from dual union
  select 5,6,7 from dual union ...
) x where ...


p.s. времена нынче не нищие, оперативной памяти много (осознайте, что гигабайт это миллионы или даже сотни миллионов строк), очень часто значительно проще, дешевле, быстрее... выгрузить данные, с которыми нужно работать в оперативную память бакэнда целиком (и хранить их там), обработать классическими методами, и залить результат в базу

Понятно этот подход нужно использовать с умом и не вставлять в любое место бездумно.

Реляционная база данных - это компромис, когда ты платишь сложностью работы с данными, кучей ограничений и низкой скоростью, за универсальность, легкий многопользовательский доступ и автоматический контроль за целостностью (транзакции), и вот когда этим можно пренебречь, появляется возможность делать так как описал
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект
21 нояб. 2024, в 19:09
5000 руб./за проект