2012-04-09 53 views
0

早上是04.17,我不能確定什麼是錯的!請幫助!MYSQL - 總結不符合預期

我有這樣的列表表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()函數返回意外的值。

如果刪除總和()我得到這樣的查詢:

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遞減從我從子查詢中得到的時間(登出時間與註銷連接)的時間。現在,我有時間用戶登錄。迄今爲止這麼好。現在,當我添加總和(就像在第一個查詢中),我會期待sum_time_of_logon(應該是30)。如果我把平均函數,而不是總和我期望15((10 + 20)/ 2)。

琛版本:我得到60, 平均版本 - 我得到30

'時間' 字段類型是整數。

我的猜測: 我想這莫名其妙的MySQL不返回2行,因爲它顯示,但它的工作對4行,還是雙打主查詢下面一些計算。因爲 - avg和sum結果都是它的兩倍。

也許這是時間問題,我的大腦不工作了,但我不知道什麼是錯的。請幫忙。

+0

內部選擇看起來很糟糕。你想要做什麼以及給定表格的預期結果是什麼? – 2012-04-09 04:49:15

+0

你能解釋一下你想查詢的內容嗎?猜測用戶登錄的持續時間 – 2012-04-09 05:31:35

回答

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 

你可以做兩步查詢嗎?

+0

我可以但是我收到錯誤消息:#1248 - 每個派生表都必須有自己的別名。我第一次在我的生活中看到它 – Kalreg 2012-04-09 03:02:31

+0

@Kalreg我編輯了 – cctan 2012-04-09 03:05:04

+0

完美的作品,謝謝。 + 1從我:> – Kalreg 2012-04-09 12:47:56

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,這也會表現的很好。

+0

不幸的是你的例子不工作。沒有'r2'或'r1'表。即使我將其更改爲t2和t1,我在查詢錯誤中得到'沒有名爲r2的字段'。我喜歡優雅的例子。 – Kalreg 2012-04-09 12:47:38

+0

好的,我修好了錯別字。現在讓我知道它是否適合你。乾杯 – Bohemian 2012-04-10 01:20:16