【发布时间】:2013-01-24 15:45:27
【问题描述】:
我对 MySQL 中的存储函数有一个非常令人沮丧的问题。
我有一个数据库,其中包含来自连接到无线热点的用户的会话数据。我正在尝试从选定月份内选择单个用户下载统计信息。我的问题是函数中的子查询似乎忽略了 WHERE 语句中的 mac 字段。这是我的代码:
CREATE FUNCTION get_month_download(mo varchar(45), box int(11), mac varchar(45)) RETURNS DOUBLE
BEGIN
DECLARE dwnld double;
IF mo IS NULL THEN
SET mo := CONCAT(CONCAT(YEAR(NOW()), '-', MONTH(NOW())),'-','01');
END IF;
SET dwnld := (
SELECT SUM(`tx_bytes`)
FROM `session`
WHERE `assoc_time` > UNIX_TIMESTAMP(mo)
AND `disassoc_time` < UNIX_TIMESTAMP(DATE_ADD(mo, INTERVAL 1 MONTH))
AND `mac` = mac
AND `controller_id` = box
);
return dwnld;
END
运行这个:
SELECT get_month_download('2012-09-01', '2', '00:21:5c:56:be:a3');
返回整个表的下载数据,尽管它使用controller_id 过滤数据。
如果我使用相同的参数在函数外部运行子查询,它可以正常工作。什么给了?
为了更清楚,运行这个查询:
SELECT SUM(`tx_bytes`)
FROM `session`
WHERE `assoc_time` > UNIX_TIMESTAMP('2012-09-01')
AND `disassoc_time` < UNIX_TIMESTAMP(DATE_ADD('2012-09-01', INTERVAL 1 MONTH))
AND `mac` = '00:21:5c:56:be:a3'
AND `controller_id` = '2';
返回该用户的正确下载统计信息。该函数返回该控制器的所有用户的统计信息。
【问题讨论】:
-
AND controller_id = box);中方框后面的多余括号是什么? -
@Ray:它匹配
SET dwnld := (SELECT SUM(tx_bytes)中的左括号。dwnld的值被设置为子查询的结果。一开始我也很困惑:) -
为了清楚起见,我已经编辑了这个问题。
-
您能否提供一个示例表架构和数据使用SQLFiddle?
-
在 SQLFiddle 中:sqlfiddle.com/#!2/2f703/1。我确实删除了一个约束,但这没关系。
标签: mysql function field where