0

现在是早上 04.17,我不知道出了什么问题!请帮忙!

我在表 user_logs 中有包含此类列的表:

id | user_id | action | reference | time
----------------------------------------
1  |   1     | login  |     0     | 1333800404
2  |   1     | logout |     1     | 1333800424
3  |   1     | login  |     0     | 1333800434
4  |   1     | logout |     3     | 1333800444

并查询:

SELECT reference r,
  sum(time-(SELECT time FROM users_logs WHERE id = r)) time_of_logon
FROM users_logs
WHERE user_id = 1 AND action = 'logout'

不幸的是 sum() 函数返回意外的值。

如果我删除 sum() 我会得到这样的查询:

SELECT reference r,
  (time-(SELECT time FROM users_logs WHERE id = r)) time_of_logon
FROM users_logs
WHERE user_id = 1 AND action = 'logout'

结果:

r | time_of_logon
-----------
1 | 20
3 | 10

正如预期的那样 - 我打印了所有行,其中 user_id = 1 的操作“注销”从我从子查询获得的时间(登录时间与注销连接)减少了注销时间。现在我有时间用户登录了。到目前为止一切都很好。现在,当我添加总和(如在第一个查询中)时,我希望 time_of_logon 的总和(应该是 30)。如果我使用 avg 函数而不是 sum 我会期望 15 ((10+20)/2)。

总和版本:我得到 60, 平均版本- 我得到 30。

“时间”字段的类型是整数。

我的猜测: 我猜 mysql 以某种方式返回的不是 2 行,但它正在处理 4 行,或者将主查询下的一些计算加倍。因为 - avg 和 sum 结果都是应有的两倍。

也许这是我的大脑不再工作的时间问题,但我无法弄清楚出了什么问题。请帮忙。

4

2 回答 2

1
SELECT user_id, sum(time_of_logon) as sum_login_time
FROM
(
  SELECT user_id,
         reference as r, 
         (time-(SELECT time FROM users_logs WHERE id = r)) as time_of_logon
  FROM users_logs 
  WHERE user_id = 1 AND action = 'logout'
) subtable
GROUP BY user_id

你能做一个两步查询吗?

于 2012-04-09T02:55:33.397 回答
0

只需使用普通连接:

select t1.id as r, t2.time - t1.time as time_of_logon
from user_logs t1
join user_logs t2 on t2.reference = t1.id
where t1.action = 'login'
and t1.user_id = 1;

除了显示的内容外,无需加入任何其他内容,因为只有注销具有非零参考值。实际上,t1.action = 'login'出于同样的原因,也没有必要,但可以保留 - 它可能有助于提高性能(你应该测试它)

如果你有一个索引,这也会表现得很好reference

于 2012-04-09T04:53:52.357 回答