gpt4 book ai didi

MySQL 查询似乎忽略了存储函数中的 WHERE 语句的一部分

转载 作者:行者123 更新时间:2023-11-29 02:30:08 24 4
gpt4 key购买 nike

我在使用 MySQL 中的存储函数时遇到了一个令人沮丧的问题。我有一个数据库,里面装满了连接到无线热点的用户的 session 数据。我正在尝试从选定月份内选择单个用户下载统计信息。我的问题是函数内的子查询似乎忽略了 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';

返回该用户的正确下载统计数据。该函数返回该 Controller 所有用户的统计信息。

最佳答案

您确定存在多个 controller_id 吗?

SELECT DISTINCT controller_id FROM session

此查询为您获取了多少条记录?

如果这只获取一条记录,并且对应于 box = 2,则没有问题。

如果有多个 Controller id,运行这个查询,

SELECT COUNT(1), controller_id 
FROM session
WHERE assoc_time > '2012-01-01'
AND disassoc_time < '2012-01-31'
AND mac = '00:21:5c:56:be:a3'
GROUP BY controller_id

返回多少行?如果它只返回 controller_id 2 的一条记录,则没有任何问题。

关于MySQL 查询似乎忽略了存储函数中的 WHERE 语句的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14505234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com