Как получить отдельные данные из массива, находящегося вне цикла (в то время как), чтобы вставить эти данные в другую таблицу?

#php #mysql #mysqli

Вопрос:

Я сделал следующее, чтобы иметь возможность получать результаты вне цикла (в то время как):

 $date_day = date('Y-m-d');
$stmt = $con->prepare("
SELECT MAX(l.id_logtrama) AS id_logtrama
     , MAX(l.fechaHora) AS fechaHora
     , l.idCliente
     , l.idEquipo
     , MAX(l.statusGlobal) AS statusGlobal
     , COUNT(*) AS total
  FROM logtrama l
  JOIN equipo e
    ON l.idEquipo = e.idEquipo
   AND l.idCliente = e.idCliente
 WHERE DATE(l.fechaHora)=?
 GROUP 
    BY l.idCliente
     , e.idEquipo
");
$stmt->bind_param("s", $date_day);
$stmt->execute();
$stmt->store_result();

$DataArray = [];
$stmt->bind_result(
    $DataArray['id_logtrama'],
    $DataArray['fechaHora'],
    $DataArray['l.idCliente'],
    $DataArray['l.idEquipo'],
    $DataArray['statusGlobal'],
    $DataArray['total']
);
while ($stmt->fetch()) {
    $row = [];
    foreach ($DataArray as $key => $val) {
        $row[$key] = $val;
    }
    $array[] = $row;
}
print_r($array);
 

В результате я получаю следующее:

 Array ( [0] => 
 Array ( [id_logtrama] => 4 
           [fechaHora] => 2021-04-19 22:01:09.059800 
           [l.idCliente] => 20 
           [l.idEquipo] => 1 
           [statusGlobal] => 2 
           [total] => 1 )
        [1] => Array ( 
          [id_logtrama] => 3 
          [fechaHora] => 2021-04-19 22:01:05.520600 
          [l.idCliente] => 20 
          [l.idEquipo] => 8 
          [statusGlobal] => 2 
          [total] => 3 )
 )
 

Мне нужно иметь возможность вставить эти данные в другую таблицу, например alert_notify :

 id_notify id_logtrama idCliente idEquipo alert_type count_notify notify_date
    1         4          20        1          2            1       2021-04-19 22:01:09.059800
    2         3          20        8          2            3       2021-04-19 22:01:05.520600
 

Как я могу достичь этой цели?

Комментарии:

1. Вы можете сделать ВСТАВКУ… ВЫБЕРИТЕ запрос напрямую, нет необходимости извлекать данные в PHP

2. Мне кажется невероятным, что вы хотели бы получить «max(statusGlobal)» независимо от даты и времени, но, эй, это ваши данные.

3. @Клубничка max (statusGlobal) -это тип предупреждения, 1 желтый, 2 зеленых и 3 красных.

4. Конечно , но если он красный утром, то он красный в вашем результате, независимо от значения fechahora

5. Вы можете сделать : INSERT INTO my_new_table (column_b) SELECT column_a FROM my_old_table; Как уже упоминалось, я сомневаюсь, что ВЫБОР, который вы предоставили выше, является тем, который вам действительно нужен.

Ответ №1:

Я предлагаю вам сделать одно заявление для SELECT и INSERT. Делать что-то вроде этого:

 INSERT INTO alert_notify AS SELECT * FROM (
    SELECT 
        MAX(l.id_logtrama) AS id_logtrama,
        MAX(l.fechaHora) AS fechaHora,
        l.idCliente,
        l.idEquipo,
        MAX(l.statusGlobal) AS statusGlobal,
        COUNT(*) AS total
    FROM logtrama l
        JOIN equipo e
            ON l.idEquipo=e.idEquipo
            AND l.idCliente=e.idCliente 
    WHERE DATE(l.fechaHora)=?
    GROUP BY l.idCliente, e.idEquipo
) AS t
WHERE NOT EXISTS (
    SELECT 'x'
    FROM alert_notify AS an
    WHERE an.idCliente = t.idCliente
    AND an.idEquipo = t.idEquipo
    AND an.notify_date = t.fetchaHora
)
 

Таким образом, будут вставлены только записи без соответствия для idCliente, idEquipo, notify_date on alert_notify .

PS: Укажите строку INTO alert_notify AS SELECT * со списком полей в правильном порядке, если порядок определенного поля в alert_notify отличается от порядка полей, возвращаемых ВЫБРАННЫМ