2012-04-21 77 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