[英]Multiple sum queries with one query
我想根據產品表中產品信息和產品歷史記錄表中的某些字段進行收集,如何在單個查詢中做到這一點?
我的示例代碼:
<table>
<thead>
<tr>
<th>Product</th>
<th>Model</th>
<th>Actıve Total</th>
<th>Pasıve Total</th>
<th>Color Total</th>
</tr>
</thead>
<tbody>
<?php
$product = $db->get_results("SELECT * FROM product WHERE (status='ACTIVE')");
foreach ($product as $p ){
$active_total = $db->get_var("SELECT SUM(price) FROM product_history WHERE pid='$p->pid' AND status='AKTIVE'");
$pasive_total = $db->get_var("SELECT SUM(price) FROM product_history WHERE pid='$p->pid' AND status='PASIVE'");
$color_total = $db->get_var("SELECT SUM(price) FROM product_history WHERE pid='$p->pid' AND status='ACTIVE' AND color='BLUE'");
?>
<tr>
<td><?php echo $p->name; ?></td>
<td><?php echo $p->model; ?></td>
<td><?php echo $active_total; ?></td>
<td><?php echo $pasive_total; ?></td>
<td><?php echo $color_total; ?></td>
</tr>
<?php } ?>
</tbody>
</table>
謝謝。
您可以使用條件聚合從一個查詢中獲得以下結果:
$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'");
您實際上可以使用LEFT JOIN
將兩個查詢合並為1:
$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
(為了與product_history
中的pid
值匹配),則應將查詢中的p.*
更改為p.pid
。 否則,理想情況下,應枚舉所需值的特定字段。 請參閱為什么SELECT *被認為有害?
我想你想知道所有的顏色,而不僅僅是藍色? 在這種情況下,我會選擇LEFT JOIN
SELECT p.pid, p.name, SUM(ph.price) AS total, ph.color, ph.status
FROM product p
LEFT JOIN product_history ph ON (p.pid = ph.pid)
WHERE p.status = 'ACTIVE'
GROUP BY p.pid, p.name, ph.status, ph.color
僅供參考:您應該真正使用准備好的語句來處理上下文更改,並避免任何類型的問題和漏洞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.