#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
отличается от порядка полей, возвращаемых ВЫБРАННЫМ