获取PHP中两个查询的总数

时间:2011-12-28 07:17:34

标签: php mysql

我按会话和特定于每个会话的项目跟踪客户的费用。我正在尝试获取总会话费用和会话项目费用(费用*从tbl_sessionitem计算)。但是当我检查结果时,代码会输出错误:

  

警告:mysql_fetch_array():提供的参数不是有效的MySQL结果资源

以下是我的表格:

CREATE TABLE tbl_session (
    `clientid` INT UNSIGNED NOT NULL,
    `sessioncost` DECIMAL(6,2) NOT NULL,
    `datetoday` DATETIME NOT NULL,
);

CREATE TABLE tbl_sessionitem (
    `clientid` INT UNSIGNED NOT NULL,
    `cost` DECIMAL(6,2) NOT NULL,
    `count` INT UNSIGNED NOT NULL,
    `datetoday` DATETIME NOT NULL
);

这是我的php代码:

 <?php

 $date=$_POST['date'];
 mysql_connect("localhost","root","");
 mysql_select_db("database");
 $sql=mysql_query("
     SELECT id
          , SUM(tbl_session.sessioncost) AS 'totalcost'
          , SUM(tbl_sessionitem.count) * SUM(tbl_sessionitem.cost) AS 'totalquantitycost'
       FROM (
             SELECT clientid
                  , sessioncost
               FROM tbl_session
               WHERE datetoday = ('$date')
           UNION ALL
             SELECT clientid
                  , cost
              , count
               FROM tbl_sessionitem
             WHERE datetoday = ('$date')
         )
     GROUP BY id");


 while($row = mysql_fetch_array($sql))
 {
     echo $row['totalcost'];
     echo $row['totalquantitycost'];
 }
 mysql_close();
 ?>

2 个答案:

答案 0 :(得分:2)

警告意味着它所说的:传递给mysql_fetch _array的值不是结果。 mysql_query返回混合值;当查询失败时,它返回false。您需要执行错误检查。 mysql_error将向您提供来自MySQL的错误消息,但请注意永远不要输出数据库error messages to non-admins

如果你这样做了,你会看到很多问题:

  • 必须为子选择结果指定别名。
  • 选择UNIONed的列数不同
  • 在子选择结果中没有名为“id”的列。
  • 聚合函数引用subselect中的表,但外部select只能访问结果表(缺少别名的表)。

即使您修复了这些SQL错误,由于分组和聚合函数的工作方式,查询本身也不会提供您正在寻找的结果。

有一个更好的方法。会话项与会话相关联,但在架构中,此关联通过datetoday列松散。结果,你对工会的使用很奇怪。而是为表创建代理键,并为会话项表提供引用会话表的列。当你在它时,删除冗余的“tbl_”前缀。

CREATE TABLE sessions (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    client INT UNSIGNED NOT NULL,
    cost DECIMAL(5,2),
    `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    FOREIN KEY (client) REFERENCES clients (id)
) Engine=InnoDB;

CREATE TABLE session_items (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    session INT UNSIGNED NOT NULL,
    cost DECIMAL(5,2),
    `count` INT UNSIGNED,
    FOREIN KEY (session) REFERENCES sessions (id)
) Engine=InnoDB;

要获取给定日期的总会话成本和数量成本,您可以使用子查询来获取会话的数量成本(防止在总成本中多次包含会话成本),然后将会话和每个客户在特定日期的总成本的外部查询中的数量成本。

SELECT client, 
       SUM(cost) AS totalcost, 
       SUM(quantitycost) AS totalquantitycost
  FROM (
        SELECT client, 
               sessions.cost,
               SUM(session_items.`count`) * SUM(session_items.cost) AS quantitycost
          FROM sessions
            JOIN session_items ON sessions.id=session_items.session
          WHERE sessions.`date` = NOW()
          GROUP BY sessions.id
  ) AS session_invoices
  GROUP BY client
;

答案 1 :(得分:0)

COUNT不能用作Column name,它是function,它的使用方式如下:

Select COUNT(id) as countOfId FROM table

另外,我建议在PHP中进行所有这些计算,更容易维护并且可能更好的性能,MySql不是计算器。

如果你想使用保留关键字作为列名,你需要添加反引号,不要用大写字母写它们,因为这会降低这种情况下的可读性:

Select `count` from table

什么是COST