Я работаю в системе бронирования отелей, и цены за ночь. В моей базе данных есть две таблицы, одна из которых называется акции и другие рекламные акции. Первая содержит одну строку за день (365 дней), а последняя – только дни, которые имеют процент скидки. Иногда, некоторые дни имеют два или более разных процентов скидки. В этом случае 30 и 31 января составляют 0,10 и 0,15.
Столовый инвентарь
date | rate -------------------------- 2017-01-29 500 2017-01-30 500 2017-01-31 500
Рекламные акции
date | percent -------------------------- 2017-01-30 0.10 2017-01-31 0.10 2017-01-30 0.15 2017-01-31 0.15
в то время как запрос mysql (SELECT s.date, s.rate, IFNULL (p.percent, 0) FROM stock s LEFT JOIN promotion p ON s.date = p.date WHERE s.date как дата BETWEEN '2017-01-29 'AND' 2017-01-31 ') Я получаю этот результат:
date | rate | percent ----------------------------------- 2017-01-29 500 0 2017-01-30 500 0.10 2017-01-31 500 0.10 2017-01-30 500 0.15 2017-01-31 500 0.15
Мне нужно создать многомерный массив, содержащий один массив для каждого процента скидки, и эти массивы содержат три дня, день 29 с процентом 0.00 и другими двумя днями 0.10. новый – 29-й день с процентом 0,00 и другими двумя днями 0,15. я tring, но я не могу назначить день 29 в обоих массивах.
Array ( [1] => Array ( [0] => Array ( [date] => 2017-01-29 [rate]=>500 [percent] => 0.00 ) [1] => Array ( [date] => 2017-01-30 [rate]=>500 [percent] => 0.10 ) [2] => Array ( [date] => 2017-01-31 [rate]=>500 [percent] => 0.10 ) ) [2] => Array ( [0] => Array ( [date] => 2017-01-29 [rate]=>500 [percent] => 0.00 ) [1] => Array ( [date] => 2017-01-30 [rate]=>500 [percent] => 0.15 ) [2] => Array ( [date] => 2017-01-31 [rate]=>500 [percent] => 0.15 ) ) )
По своей сути это похоже на проблему с базой данных.
Установите столбец процента как NOT NULL и установите 0 как DEFAULT.
ALTER TABLE promotions CHANGE COLUMN percent [maintain-its-type] NOT NULL DEFAULT '0';
Тогда это вопрос (если я понимаю проблему), вырывая значения MAX () и MIN () процентов для каждой даты.
SELECT s.date, s.rate, MAX(p.percent) AS maxperc, MIN(p.percent) AS minperc FROM stock s LEFT JOIN promotions p ON s.date = p.date WHERE s.date BETWEEN '2017-01-29' AND '2017-01-31' GROUP BY s.date,s.rate;
… Я не тестировал это, так что, возможно, вам нужно немного поиграть.
Затем, когда вы завершаете свой результирующий набор, вы можете объявить два отдельных подмассива и построить свой полный массив.
$array=[]; $i=0; while($row=mysqli_fetch_assoc($result)){ $array[0][$i]["date"]=$row["date"]; $array[0][$i]["rate"]=$row["rate"]; $array[0][$i]["perc"]=$row["minperc"]; $array[1][$i]["date"]=$row["date"]; $array[1][$i]["rate"]=$row["rate"]; $array[1][$i]["perc"]=$row["maxperc"]; ++$i; }
в$array=[]; $i=0; while($row=mysqli_fetch_assoc($result)){ $array[0][$i]["date"]=$row["date"]; $array[0][$i]["rate"]=$row["rate"]; $array[0][$i]["perc"]=$row["minperc"]; $array[1][$i]["date"]=$row["date"]; $array[1][$i]["rate"]=$row["rate"]; $array[1][$i]["perc"]=$row["maxperc"]; ++$i; }
К этому моменту я сделал слишком много предположений о вашей цели / использовании. В принципе, установите нуль как процент по умолчанию, запрос для самого высокого и самого низкого процента для каждой пары с датой (если ноль, то нуль появится как самое высокое и самое низкое значение). Выполняйте все, что пожелаете, с помощью набора результатов.