Вы можете использовать условное агрегирование, чтобы получить эти результаты из одного запроса:
$sql = "SELECT
SUM(CASE WHEN status='AKTIVE' THEN price ELSE 0 END) AS aktive,
SUM(CASE WHEN status='PASIVE' THEN price ELSE 0 END) AS pasive,
SUM(CASE WHEN status='AKTIVE' AND color='BLUE' THEN price ELSE 0 END) AS color,
FROM product_history
WHERE pid='$p->pid'");
Вы можете объединить оба ваших запроса в 1, используя LEFT JOIN
:
$sql = "SELECT p.*,
SUM(CASE WHEN h.status='AKTIVE' THEN h.price ELSE 0 END) AS aktive,
SUM(CASE WHEN h.status='PASIVE' THEN h.price ELSE 0 END) AS pasive,
SUM(CASE WHEN h.status='AKTIVE' AND h.color='BLUE' THEN h.price ELSE 0) AS color
FROM product p
LEFT JOIN product_history h ON h.pid = p.pid
WHERE p.status='ACTIVE'
GROUP BY p.pid";
Если единственное интересующее значение из product
- это pid
(в целях сопоставления со значением pid
в product_history
), вы должны изменить p.*
в запросе на p.pid
. В противном случае вы должны в идеале перечислить конкретные поля, значения которых вы хотите. См. Почему SELECT * считается вредным?