10.3.36-MariaDB
объясняю раскладывая все по буквам.
есть товар, который имеет несколько атрибутов, для примера возьмем 5 шт., они лежат все в одной таблице и имеют разные attribute_id, в запрос приходят 3 параметра, к примеру 200, 80, 15, пример записи в таблице
spoiler
product_id attribute_id text
1 10 200
2 10 230
3 10 200
1 12 80
2 12 80
3 12 80
1 15 15
2 15 13
3 15 15
1 80 Сони
2 80 Сони
3 80 Сони
1 90 66
2 90 60
3 90 71
по запросу нужно получить значение атрибута с attribute_id = 80 и с теми значениями которые еще пришли
то есть результат должен быть Сони и total = 2 так как всем условиям соответствует 2 товара, то есть товары с product_id 1 и 3
-- Тестовая выборка
with product_attribute as (select 1 product_id, 10 attribute_id, '200' text from dual union all
select 2, 10, '230' from dual union all
select 3, 10, '200' from dual union all
select 1, 12, '80' from dual union all
select 2, 12, '80' from dual union all
select 3, 12, '80' from dual union all
select 1, 15, '15' from dual union all
select 2, 15, '13' from dual union all
select 3, 15, '15' from dual union all
select 1, 80, 'Сони' from dual union all
select 2, 80, 'Сони' from dual union all
select 3, 80, 'Сони' from dual union all
select 1, 90, '66' from dual union all
select 2, 90, '60' from dual union all
select 3, 90, '71' from dual),
product as (select 1 product_id from dual union all
select 2 from dual union all
select 3 from dual
)
-- Сам запрос поиска
Select A.*,
count(*) over () cnt -- количество товаров в результате поиска
from (SELECT p.product_id,
-- далее, его свойства
(select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 80) product_name, -- наименование item-а
(select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 10) wdt,
(select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 12) hgt,
(select pp.text from product_attribute pp where p.product_id = pp.product_id and pp.attribute_id = 15) dia
FROM product p
) A
where 1 = 1
-- тут пишем поисковой довесок условий
and A.wdt = 200
and A.hgt = 80
and A.dia = 15
product_id product_name wdt hgt dia cnt
1 Сони 200 80 15 2
3 Сони 200 80 15 2
if ($result->num_rows > 0 && $order['status_cart'] == 'Ожидает оплаты')
{
// do something
}
select a.*
from (
select s.*,
row_number() over (partition by `customer_id` order by unit_importance, updated_at desc) rn
from stream s
) a
where a.rn = 1
WITH RECURSIVE
-- Тестовая выборка. Если есть "живая" таблица, то эту выборку можно убрать
t as (select 10.000 value union
select 10.001 union
select 10.002 union
select 10.003 union
select 10.005 union
select 10.009 -- специально добавил контр. пример
),
-- Таблица-генератор последовательности чисел от min(t.value) до max(t.value) с шагом 0.001 с помощью CTE (есть ограничение по глубине рекурсии!)
num_series AS (
SELECT (select min(value) from t) AS num
UNION ALL
SELECT num + 0.001 FROM num_series
WHERE num < (select max(value) from t)
)
-- Запрос, в котором сопоставляем таблицу генератор и исходную таблицу, чтобы найти недостающие кванты
SELECT *
FROM num_series
where not exists(select t.value from t where t.value = num_series.num)
and num_series.num >= 10.000
select count(case when scv.date >= CURDATE() then 1 end) today_count,
count(case when scv.date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) and scv.date < CURDATE() then 1 end) yesterday_count,
count(case when scv.date >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK) then 1 end) week_count,
count(case when scv.date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) then 1 end) month_count
from statistics_couter_visit as scv
where scv.date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) -- тут ограничение по макс. окну просмотра статистики, то есть по month_count
select count(case when scv.date >= UNIX_TIMESTAMP(CURDATE()) then 1 end) today_count,
count(case when scv.date >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) and scv.date < UNIX_TIMESTAMP(CURDATE()) then 1 end) yesterday_count,
count(case when scv.date >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 WEEK)) then 1 end) week_count,
count(case when scv.date >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) then 1 end) month_count
from statistics_couter_visit as scv
where scv.date >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) -- тут ограничение по макс. окну просмотра статистики, то есть по month_count
при желании ее удалять
if(isset($_POST['action']) && $_POST['action'] == 'delete') // есть action и он равен delete
{
$link = mysqli_connect($host, $user, $password, $database);
$sql = "DELETE FROM `program_day_1`"; // по одной инструкции удаления на каждую таблицу
$res = mysqli_query($link, $sql);
$sql = "DELETE FROM `program_day_2`";
$res = mysqli_query($link, $sql);
mysqli_close($link);
header('location: program-admin.php');
}
while($row=mysqli_fetch_array($res))
{
// #########################
// #### начало тела цикла #####
// ##########################
$iduser=$id;
$idkat=$row['idkat'];
// #########################
// #### конец тела цикла #####
// ##########################
}
$res=mysqli_prepare($bd, "INSERT INTO zakaz (iduser,idkat)
VALUES(?,?)");
mysqli_stmt_bind_param($res, 'ii', $iduser,$idkat); // подставляем переменные, которые присвоились на ПОСЛЕДНЕМ прогоне цикла
$result2=mysqli_stmt_execute($res);
while($row=mysqli_fetch_array($res))
{
// #########################
// #### начало тела цикла #####
// ##########################
$iduser=$id;
$idkat=$row['idkat'];
$res2=mysqli_prepare($bd, "INSERT INTO zakaz (iduser,idkat)
VALUES(?,?)");
mysqli_stmt_bind_param($res2, 'ii', $iduser,$idkat); // подставляем переменные, которые присвоились на ТЕКУЩЕМ прогоне цикла
$result2=mysqli_stmt_execute($res2);
// #########################
// #### конец тела цикла #####
// ##########################
}
$result =
[
1 => // department_id
[
1 /* 000i индекс */ => [1 /*индекс вида предмета*/ => '1_1_0001', 2 => '1_2_0001', 3 => '1_3_0001' /* непосредственно данные */],
2 /* 000i индекс */ => [1 /*индекс вида предмета*/ => '1_1_0002', 2 => '1_2_0002', 3 => '1_3_0002' /* непосредственно данные */],
3 /* 000i индекс */ => [1 /*индекс вида предмета*/ => '1_1_0003', 3 => '1_3_0003' /* непосредственно данные */],
...
],
2 =>
...
];
select t.department_id,
t1.item as type_1,
t2.item as type_2,
...
from t
left join (select t.department_id, t.item from t where t.type_id = 1) t1 on t1.department_id = t.department_id
left join (select t.department_id, t.item from t where t.type_id = 2) t2 on t2.department_id = t.department_id
...
where 1 = 1
and (SUBSTRING_INDEX(t.item, '_', -1) + 0 = SUBSTRING_INDEX(t1.item, '_', -1) + 0 or t1.item is null)
and (SUBSTRING_INDEX(t.item, '_', -1) + 0 = SUBSTRING_INDEX(t2.item, '_', -1) + 0 or t2.item is null)
...
-- тут нужно получить равенство всех субиндексов 0000i от t.item сравнить со всеми tn.item
order by t.department_id, SUBSTRING_INDEX(t.item, '_', -1) + 0
<?php
error_reporting(E_ALL); // репорт ошибок в файл error_log
ini_set('display_errors', 'On'); // вывод сообщения об ошибке
var_dump($_POST);
var_dump($pdo->errorInfo());
писать скрипт, который будет вытаскивать по запросу необходимые записи, далее для каждой записи разбирать сер.массив, находить нужное значение, изменять его и затем записывать новый массив с изменённым значением в БД
/* создание подготавливаемого запроса */
$stmt = $mysql->prepare("select sum(c.`Price`) as price_sum
from `dogovor` d
join `catalog` c on c.`Id_Product` = d.`Id_Product`
where d.`id_client` = ?");
/* связывание параметров с метками */
$stmt->bind_param("i", $id_client);
/* выполнение запроса */
$result = $stmt->execute();
/* выборка результатов */
$row = $result->fetch_accos();
if($row)
{
echo 'Общая стоимость всех заказов клиента: '.$row['price_sum'];
}
else
{
echo 'Запрос не дал результата!';
}