Php 使用一个查询进行多个求和查询
我想根据products表中product information(产品信息)和product history(产品历史记录)表中的一些字段进行收集如何在单个查询中进行收集 我的示例代码:Php 使用一个查询进行多个求和查询,php,mysql,sum,Php,Mysql,Sum,我想根据products表中product information(产品信息)和product history(产品历史记录)表中的一些字段进行收集如何在单个查询中进行收集 我的示例代码: <table> <thead> <tr> <th>Product</th> <th>Model</th> <t
<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'");
实际上,您可以使用左连接将两个查询合并为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\u history
中的pid
值进行匹配),您应该将查询中的p.
更改为p.pid
。否则,理想情况下应该枚举需要其值的特定字段。请参见您可以使用条件聚合从一个查询中获取这些结果:
$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:
$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\u history
中的pid
值进行匹配),您应该将查询中的p.
更改为p.pid
。否则,理想情况下应该枚举需要其值的特定字段。看我想你想知道所有的颜色,而不仅仅是蓝色?
在这种情况下,我会使用左连接
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
供参考:
您真的应该使用准备好的语句来处理上下文更改,并避免任何类型的问题和漏洞。我想您想知道所有颜色,而不仅仅是蓝色?
在这种情况下,我会使用左连接
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
供参考:
您真的应该使用准备好的语句来处理上下文更改,并避免任何类型的问题和漏洞。这些答案之一解决了您的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标记答案,最好地解决了你的问题接受。看,嗨,我已经一个星期没弄明白了。我问了一些关于样本数据库的问题。实际数据库上的代码不起作用。试着开发样本,你给我问题的答案,帮助我纠正正确的答案。感谢您的帮助。如果您能提供更多信息,可能有助于解决您的问题。以下答案之一是否解决了您的问题?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标记答案,最好地解决了你的问题接受。看,嗨,我已经一个星期没弄明白了。我问了一些关于样本数据库的问题。实际数据库上的代码不起作用。试着开发样本,你给我问题的答案,帮助我纠正正确的答案。感谢您的帮助。如果您能提供更多信息,可能有助于解决您的问题。