I grunden känns detta som ett databasproblem.
Ställ in procentkolumnen som NOT NULL och ställ in 0 som DEFAULT.
ALTER TABLE promotions CHANGE COLUMN percent [maintain-its-type] NOT NULL DEFAULT '0';
Sedan handlar det om (om jag förstår problemet) att plocka MAX() och MIN() procentvärdena för varje datum.
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;
...jag har inte testat det, så det kan behöva pillas med.
När du sedan går igenom din resultatuppsättning kan du deklarera de två separata subarrayerna och bygga din kompletta array.
$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;
}
Vid det här laget har jag gjort för många antaganden om ditt syfte/användning. I grund och botten, ställ in noll som standard för procent, fråga efter högsta och lägsta procent för varje datum-hastighetspar (om noll kommer noll att visas som högsta och lägsta värde). Gör vad du vill med resultatuppsättningen.