2010-04-08 37 views
2

我有3個表:最大計數加入

用戶:

Id Login 
1 John 
2 Bill 
3 Jim 

電腦:

Id Name 
1 Computer1 
2 Computer2 
3 Computer3 
4 Computer4 
5 Computer5 

會議:

UserId ComputerId Minutes 
1  2   47 
2  1   32 
1  4   15 
2  5   5 
1  2   7 
1  1   40 
2  5   31 

我想顯示此結果表:

Login Total_sess Total_min Most_freq_computer Sess_on_most_freq Min_on_most_freq 
John 4   109   Computer2   2     54 
Bill 3   68   Computer5   2     36 
Jim  -   -   -     -     - 

自己,我只能滿足前3列有:

SELECT Login, COUNT(sessions.UserId), SUM(Minutes) FROM users 
LEFT JOIN sessions 
ON users.Id = sessions.UserId GROUP BY users.Id 

與某種其他列的有:

SELECT main.* 
FROM (SELECT UserId, ComputerId, COUNT(*) AS cnt ,SUM(Minutes) 
FROM sessions 
GROUP BY UserId, ComputerId) AS main 
INNER JOIN (
SELECT ComputerId, MAX(cnt) AS maxCnt FROM (
SELECT ComputerId, UserId, COUNT(*) AS cnt FROM sessions GROUP BY ComputerId, UserId 
) 
AS Counts GROUP BY ComputerId) 
        AS maxes 
ON main.ComputerId = maxes.ComputerId 
AND main.cnt = maxes.maxCnt 

但我需要在一個查詢中得到整個結果表。我覺得我在做一些完全錯誤的事情。需要幫忙。

+1

它看起來像一個查詢 - 你的意思是你不希望使用嵌套查詢此外,SQL您使用的是哪一個? ?PostreSQL?MySQL?MS SQL? – 2010-04-08 17:19:20

回答

3

給你:

SELECT u.login, t1.total_sess, t1.total_min, t2.mf, t2.sess_mf, t2.min_mf 
FROM  users u 
LEFT JOIN (
    SELECT userid, COUNT(minutes) AS total_sess, SUM(minutes) AS total_min 
    FROM  sessions 
    GROUP BY userid 
) AS t1 ON t1.userid = u.id 
LEFT JOIN (
    SELECT userid, name AS mf, COUNT(*) AS sess_mf, SUM(minutes) AS min_mf 
    FROM  sessions s 
    JOIN  computers c ON c.id = s.computerid 
    GROUP BY userid, computerid 
    HAVING COUNT(computerid) >= ALL(SELECT COUNT(*) 
            FROM  sessions s2 
            WHERE s2.userid = s.userid 
            GROUP BY s2.computerid) 
) AS t2 ON t2.userid = u.id 

我使用MySQL的語法,但它應該是相當便攜。

如果您需要更多,請隨時問!

編輯:我更新了查詢,前一個是錯誤的:(

+2

@Yassin:您的'HAVING'子句仍然存在問題,此時它的工作原理是因爲兩個用戶的Sess_on_most_freq爲2,但如果您爲計算機5上的Bill添加另一個會話,那麼查詢就會中斷,在HAVING子句中增加'WHERE user_id = s.user_id'應該可以解決這個問題 – 2010-04-08 18:31:43

+0

謝謝!你太棒了!如果你推薦我一些關於SQL的goob書籍,我將不勝感激。 – user311719 2010-04-08 18:33:38

+0

+1的方法 – Unreason 2010-04-08 18:34:05