我按会话和特定于每个会话的项目跟踪客户的费用。我正在尝试获取总会话费用和会话项目费用(费用*从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();
?>
答案 0 :(得分:2)
警告意味着它所说的:传递给mysql_fetch _array
的值不是结果。 mysql_query
返回混合值;当查询失败时,它返回false
。您需要执行错误检查。 mysql_error
将向您提供来自MySQL的错误消息,但请注意永远不要输出数据库error messages to non-admins。
如果你这样做了,你会看到很多问题:
即使您修复了这些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
?