2012-04-21 53 views
1

我一直有这个问题最困难的时间。我有2个表格,总共列,我想汇总在一起。他们都有相同的列,我使用两个表格,一个是脚本生成的数据表格,另一个是用户输入的数据,我们需要将它们分开。除了现在我们需要将它们总计在一起。MySql/PHP SUM 2表1查询

表1

+-----------+-----+--------+------+ 
    | date  |t_id | t_port | total| 
    +-----------+-----+--------+------+ 
    |2012-04-01 | 1271| 101 | 80.00| 
    +-----------+-----+--------+------+ 

表2

+----------+------+--------+-------+ 
| date  | t_id | t_port | total | 
+----------+------+--------+-------+ 
|2012-04-20| 1271 | 101 | 120.00| 
+----------+------+--------+-------+ 

总应该是$ 200.00

这里是我的查询

"SELECT SUM(cntTotal) as total FROM CBS_WO WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id' UNION SELECT SUM(cntTotal) as total FROM CNT_MODS WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id'" 

此查询似乎在phpMyAdmin中工作,因为我得到2行。 (每个表1个),逻辑上我使用PHP中的WHILE循环将两行添加到一起。在手动回显每一行后,我发现我的第二行没有出现在循环中,但它在查询中出现?

无法弄清楚为什么会发生这种情况,我确信这是愚蠢的,但我已经在这个代码已经超过16小时了,需要一组新的眼睛。

PHP代码

function periodTotal() 
{ 
    include('/sql.login.php'); 

    $t_id     = "1271"; 
    $t_port     = "101"; 
    $date     = date("Y-m-d"); 

    # FIND MONTH (DATE) 
    $monthStart  = date("Y-m-d", strtotime(date('m').'/01/'.date('Y').' 00:00:00')); 
    $monthFirst  = date("Y-m-d", strtotime('-1 second',strtotime('+15 days',strtotime(date('m').'/01/'.date('Y').' 00:00:00')))); 
    $monthSecond = date("Y-m-d", strtotime('-1 second',strtotime('+16 days',strtotime(date('m').'/01/'.date('Y').' 00:00:00')))); 
    $monthEnd  = date("Y-m-d", strtotime('-1 second',strtotime('+1 month',strtotime(date('m').'/01/'.date('Y').' 00:00:00')))); 

    if ($date = $monthFirst) 
    { 
     $sql = $dbh->prepare("SELECT SUM(cntTotal) as total FROM CBS_WO WHERE (date BETWEEN '$monthStart' AND '$monthFirst') AND t_port = '$t_port' AND t_id = '$t_id' UNION SELECT SUM(cntTotal) as total FROM CNT_MODS WHERE (date BETWEEN '$monthStart' AND '$monthFirst') AND t_port = '$t_port' AND t_id = '$t_id'"); 
     $sql->execute(); 
    } 
    else 
    { 
     $sql = $dbh->prepare("SELECT SUM(cntTotal) as total FROM CBS_WO WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id' UNION SELECT SUM(cntTotal) as total FROM CNT_MODS WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id'"); 
     $sql->execute(); 
    } 
     while($row = $sql->fetch(PDO::FETCH_ASSOC)) 
     { 
      $total += $row['total']; 
     } 

    return $total; 
} 

回答

2

这是否对你的工作?

SELECT SUM(`total`) as `total` FROM ((
    SELECT SUM(cntTotal) as total FROM CBS_WO 
    WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id' 
) UNION (
    SELECT SUM(cntTotal) as total FROM CNT_MODS 
    WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id'" 
)) as temp 

这可能是更有效的:

SELECT SUM(total) FROM (
    SELECT cntTotal FROM CBS_WO 
    WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id' 
) UNION (
    SELECT cntTotal FROM CNT_MODS 
    WHERE (date BETWEEN '$monthSecond' AND '$monthEnd') AND t_port = '$t_port' AND t_id = '$t_id'" 
) as temp 

(只有一个SUM),但你不得不对它进行测试。

+0

是的,它在sql中完美工作,但我似乎无法在PHP中显示它? – devfunkd 2012-04-21 18:54:51

+1

$ row = $ sql-> fetch(PDO :: FETCH_ASSOC); $ total = $ row ['total']; – devfunkd 2012-04-21 18:55:58

+0

'SELECT SUM(total)AS total FROM('... – sbczk 2012-04-21 19:26:47

0
It seems to be able to display your it in PHP...... 

=> set the PDO error mode to exception 

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $dbh->prepare(Run Sql Query here...........); 

=> exceute the query 

stmt->execute(); 

=>by setting the FETCH mode we can set 

$result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

=> The iterator will fetch the results for us. 

foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) 
     { 
     echo $v; 
     } 
+0

好吧,我想我发现了这个问题,但不知道如何解决这个问题,我按照上面的说法做了,而且我得到的查询错误是“有自己的别名“ - 不是查询结束时的AS温度别名? – devfunkd 2012-04-22 23:10:57

+0

** GOT IT!**我使用Frits van Campen的答案的第一个查询,它完美地工作,出于某种原因,第二个一个是造成这个问题,谢谢!所有的帮助和答案。 – devfunkd 2012-04-22 23:22:48