【问题标题】:MySql/PHP SUM 2 tables 1 queryMySql/PHP SUM 2表1查询
【发布时间】:2012-04-21 18:13:55
【问题描述】:

我遇到了这个问题最困难的时期。我有 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'"

当我得到 2 行时,这个查询似乎在 phpMyAdmin 中有效。 (每个表 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;
}

【问题讨论】:

    标签: php mysql sum


    【解决方案1】:

    这对你有用吗?

    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)但您必须对其进行测试。

    【讨论】:

    • 是的,它在 sql 中完美运行,但我似乎无法在 PHP 中显示它?
    • $row = $sql->fetch(PDO::FETCH_ASSOC); $total = $row['total'];
    【解决方案2】:
    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; 
            }
    

    【讨论】:

    • 好的,我想我找到了问题,但不知道如何解决。我按照你上面说的做了,我得到的查询错误是“每个派生表都必须有自己的别名”——查询末尾的 AS temp 不是别名吗?
    • 明白了!我使用了 Frits van Campen 的回答的第一个查询,它工作得很好,由于某种原因,第二个导致了问题。谢谢你!寻求所有帮助和答案。
    猜你喜欢
    • 2011-04-10
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多