Pada intinya, ini terasa seperti masalah database.
Setel kolom persen sebagai NOT NULL dan setel 0 sebagai DEFAULT.
ALTER TABLE promotions CHANGE COLUMN percent [maintain-its-type] NOT NULL DEFAULT '0';
Maka itu adalah masalah (jika saya memahami masalahnya) memetik nilai persen MAX() dan MIN() untuk setiap tanggal.
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;
...Saya belum mengujinya, jadi mungkin perlu sedikit mengutak-atik.
Kemudian saat Anda mengulang set hasil Anda, Anda dapat mendeklarasikan dua subarray terpisah dan membangun array lengkap Anda.
$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;
}
Pada titik ini, saya telah membuat terlalu banyak asumsi tentang tujuan/penggunaan Anda. Pada dasarnya, tetapkan nol sebagai default persen, kueri untuk persen tertinggi dan terendah untuk setiap pasangan tingkat tanggal (jika nol, maka nol akan muncul sebagai tertinggi dan terendah nilai). Lakukan apa pun yang Anda inginkan dengan set hasil.