Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中获取两个查询的总数_Php_Mysql - Fatal编程技术网

在PHP中获取两个查询的总数

在PHP中获取两个查询的总数,php,mysql,Php,Mysql,我正在按会话和特定于每个会话的项目跟踪客户的成本。我试图获得总会话成本和会话项目成本(成本*计数来自tbl_sessionitem)。但当我检查结果时,代码会输出错误: 警告:mysql\u fetch\u array():提供的参数不是有效的mysql结果资源 这是我的桌子: CREATE TABLE tbl_session ( `clientid` INT UNSIGNED NOT NULL, `sessioncost` DECIMAL(6,2) NOT NULL,

我正在按会话和特定于每个会话的项目跟踪客户的成本。我试图获得总会话成本和会话项目成本(成本*计数来自
tbl_sessionitem
)。但当我检查结果时,代码会输出错误:

警告:mysql\u fetch\u 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();
 ?>

计数
不能用作
列名
,它是一个
函数
,使用方式如下:

Select COUNT(id) as countOfId FROM table
此外,我建议您在
PHP
中进行所有这些计算,这样更易于维护,而且性能可能更好,MySql并不是一个计算器

如果要使用保留关键字作为列名,则需要添加反勾号,并且不要使用大写字母,因为这样会降低本例中的可读性:

Select `count` from table

什么是成本?

警告的意思是:传递给mysql\u fetch\u array的值不是结果
mysql\u query
返回一个混合值;当查询失败时,它返回
false
。您需要执行错误检查
mysql\u error
将从mysql向您发送一条错误消息,但请注意不要输出数据库

如果你这样做了,你会发现很多问题:

  • 必须为子选择结果提供别名
  • 正在联合的选择具有不同的列数
  • 子选择结果中没有名为“id”的列
  • 聚合函数引用子选择中的表,但外部选择只能访问结果表(缺少别名的表)
即使修复了这些SQL错误,由于分组和聚合函数的工作方式,查询本身也不会给出所需的结果

有一种更好的方法。会话项与会话相关联,但在模式中,通过
datetoday
列,这种关联是松散的。结果,你有了工会的奇怪用途。相反,为表创建代理键,并为会话项表指定一列,该列引用会话表。当你这样做的时候,去掉多余的“tbl_”前缀

要获取给定日期的总会话成本和数量成本,可以使用子查询获取会话的数量成本(防止在总成本总和中多次包含会话成本所必需的),然后在外部查询中对给定日期的每个客户端的总成本进行会话成本和数量成本总和

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
;

但是上面提到的第二个表名是“tbl_sessioncost”,请尝试使用that@Ampere我错了,先生。我已经将其修改为tbl_SessionItem示例代码容易受到攻击,这是一个非常严重的问题。要修复这个漏洞,请将过时的mysql扩展切换到并使用,将值作为参数传递给语句,而不是直接插入字符串。如果您需要PDO教程,请尝试。您保存的站点可能只是您自己的站点。正确的(这里是SQL语句)比任何特别的模式和示例数据格式更有用。请使用
CREATE TABLE
和(提供样本数据时)
INSERT。。。样本的值
。所需的结果不需要作为示例代码显示,因为结果是代码的输出,而不是代码本身。表tbl_sessionitem中的clientid和datetoday列是多余的。相反,这两个表应该有自己的表,tbl_sessionitem应该有一个列,它是tbl_会话的外键。然后,使用联接而不是联合(和子选择)从两个表中获取数据。我需要将列名“COUNT”更改为一个新名称,例如cost是20.00,需要与COUNT相乘。例如20.00*5所以总成本是100.00。Count是数量。请重写此查询并仅选择数据,不进行任何计算。在PHP中,这很容易。从中可以看出:“允许将内置函数的名称用作标识符,但可能需要谨慎使用。例如,COUNT作为列名是可以接受的。”尽管如此,用倒钩引用这样的列名仍然是一个好主意。@saratis您是否建议不要让MySQL计算表中的行数,而应该获取所有这些行?
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
;