2012-04-21 15 views
1

私はこの問題で最も困難な時間を過ごしてきました。私は一緒に合計したい合計の列を持つ2つのテーブルがあります。彼らはどちらも同じ列を持っている、私は2つのテーブルを使用して1つのスクリプトのデータのテーブルを生成し、もう1つはユーザーが入力したデータであり、我々はそれらを分離する必要があります。それ以外は、それらを合計(合計)する必要があります。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つ)、論理的に私は2つの行を一緒に追加するためにPHPでWHILEループを使用しました。手動で各行をエコーし​​た後、2番目の行がループ内に表示されていないことがわかりましたが、クエリではそれが実行されていますか?

これはなぜ起こっているのか分かりませんが、私はそれが愚かなものだと確信していますが、私はこのコードですでに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

+1

$ row = $ sql-> fetch(PDO :: FETCH_ASSOC); $ total = $ row ['total']; – devfunkd

+0

'合計SUMを選択する(' ... – sbczk

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

)問題が見つかりましたが、解決方法がわからないと思います。上記のようにして、クエリエラーは「すべての派生テーブルは必須です – devfunkd

+0

** Frits van Campenの答えで最初のクエリを使用しましたが、何らかの理由で完全に機能しました。 1つは問題を引き起こしていました。ありがとうございました!すべてのヘルプと回答に感謝します。 – devfunkd

関連する問題