1

私はこの問題でこれまでで最も困難な時間を過ごしてきました。一緒に合計したい合計列を持つ2つのテーブルがあります。どちらも同じ列を持ちます.1つはスクリプトで生成されたデータのテーブルであり、もう1つはユーザーが入力したデータであり、それらを別々にする必要があるため、2つのテーブルを使用しています。今を除いて、それらを合計する必要があります。

表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 ループを使用して 2 つの行を一緒に追加しました。各行を手動でエコーアウトした後、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;
}
4

2 に答える 2

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

(1つだけありSUMます)が、それをテストする必要があります。

于 2012-04-21T18:17:24.377 に答える
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; 
        }
于 2012-04-21T19:11:56.923 に答える