2015-12-01 41 views
-1

我有一系列SQL查询来输出所有12个月的数值。最小化一系列SQL查询

$chartIncomejan  = $query->fetch("SELECT *, SUM(rent_amount) AS 'num' FROM transaction WHERE paid_on LIKE '%2015-01%'"); 
$chartIncomefeb  = $query->fetch("SELECT *, SUM(rent_amount) AS 'num' FROM transaction WHERE paid_on LIKE '%2015-02%'"); 
$chartIncomemar  = $query->fetch("SELECT *, SUM(rent_amount) AS 'num' FROM transaction WHERE paid_on LIKE '%2015-03%'"); 
$chartIncomeapr  = $query->fetch("SELECT *, SUM(rent_amount) AS 'num' FROM transaction WHERE paid_on LIKE '%2015-04%'"); 
... 

这是我的输出

if ($chartIncomejan['num'] > '0') { echo $chartIncomejan['num'].','; } else { echo '0,'; } 
if ($chartIncomefeb['num'] > '0') { echo $chartIncomefeb['num'].','; } else { echo '0,'; } 
if ($chartIncomemar['num'] > '0') { echo $chartIncomemar['num'].','; } else { echo '0,'; } 
if ($chartIncomeapr['num'] > '0') { echo $chartIncomeapr['num'].','; } else { echo '0,'; } 
... 

它作为回声逗号分隔值列表码...等

我想这个代码减少到最小可能的代码量,但我不知道从哪里开始。我应该做阵列吗?也许是一个foreach语句?如果你可以展示一个例子(不一定用我的代码),那也会很有帮助。

+0

我不知道为什么我会被低估。这是一个真正尝试学习最佳实践的人的合理问题... –

+0

什么数据类型是'paid_on'列 – RiggsFolly

+0

'paid_on'是TIMESTAMP –

回答

2

你也许能够使用的东西像这样(未经测试)

/* Assuming mysqli */ 

$sql="select *, sum(`rent_amount`) as 'num' from `transaction` 
    where year(`paid_on`)=year(now()) 
    group by month(`paid_on`);"; 

$res=$conn->query($sql); 

if($res){ 
    $chartIncomes=$res->fetch_all(); 

    /* process array to your needs */ 
    echo '<pre>',print_r($chartIncomes,true),'</pre>' 
} 

$conn->close(); 
+0

这帮助我解决了我的问题。谢谢! –

1

为什么不改变条件并收集一个查询中的所有数据?

$chartIncome = $query->fetch("SELECT *, SUM(rent_amount) AS 'num' FROM transaction WHERE paid_on BETWEEN '2015-01-01' AND '2015-04-31'"); 

这是假设你的列paid_onDATE。您将获得$chartIncome所有数据,然后你只是这样做:

echo $chartIncome['num'].','; 

的情况是没有必要的,如果你只是始终显示结果

+0

'paid_on'实际上是一个TIMESTAMP。如果我要做'BETWEEN'2015-01-01 00:00:00'和'2015-04-31 23:59:59''这样的事情吗?我试了一下,但是在一个列表中查找每个月的总和时输出了一个大数目。 –