2010-07-14 56 views
0

我有一個問題,一個SQL語句: 使用此MySQL的:問題與MAX()和GROUP BY - 錯誤的價值觀

select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(timestampCol)) as date, 
a_au.re as RE, a_au.stat as STAT from b_c 
    inner join c on b_c.c_id = c.id 
    inner join a on c.id = a.c_id 
    inner join a_au on a.id = a_au.id 
    inner join revi on a_au.rev = revi.rev 
    where b_c.b_id = 5 

我得到這樣的結果:

ID DUR   date RE STAT 
------------------------------- 
31, 10, '2010-07-14', 2200, 0 
31, 10, '2010-07-14', 2205, 0 
31, 10, '2010-07-14', 2206, 2 
31, 10, '2010-07-14', 2207, 0 
31, 10, '2010-07-14', 2210, 2 
31, 10, '2010-07-15', 2211, 0 
31, 10, '2010-07-14', 2213, 1 
32, 10, '2010-07-14', 2203, 0 
32, 10, '2010-07-14', 2204, 0 
32, 10, '2010-07-14', 2208, 2 
32, 10, '2010-07-14', 2209, 0 
32, 10, '2010-07-15', 2212, 2 

現在我想爲一個ID和日期組合獲取一個結果行。此外,我想獲得具有最高RE號碼的結果行。

所以,我寫我的發言:

select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(timestampCol)) as date, 
max(a_au.re) as RE, a_au.stat as STAT from b_c 
    inner join c on b_c.c_id = c.id 
    inner join a on c.id = a.c_id 
    inner join a_au on a.id = a_au.id 
    inner join revi on a_au.rev = revi.rev 
    where b_c.b_id = 5 
    group by ID, date 

現在我得到這樣的結果:

ID DUR   date RE STAT 
------------------------------- 
31, 10, '2010-07-14', 2213, 0 
31, 10, '2010-07-15', 2211, 0 
32, 10, '2010-07-14', 2209, 0 
32, 10, '2010-07-15', 2212, 2 

似乎一切會好起來的,我每天/ ID組合中的一個結果行與行最高的RE值。但是:列STAT沒有正確的值! 行

31, 10, '2010-07-14', 2213, 0 

的狀態必須爲1:

31, 10, '2010-07-14', 2213, 1 

所以必須有我的說法是錯誤的。看起來MySQL使用它找到的第一個STAT列值。但我想有相應的一個。

我該怎麼辦? 我在這裏看到有關此類的其他主題: Selecting all corresponding fields using MAX and GROUP BY 但我無法將其傳遞到我的SQL語句。

非常感謝&最好的問候。

+0

添加了「最大每個組的標籤」。點擊該標籤可查看其他幾十個類似問題的帖子。 – 2010-07-14 16:17:12

回答

1

用途:

SELECT a.id as ID, 
     a.dur as DUR, 
     DATE(FROM_UNIXTIME(timestampCol)) as date, 
     a_au.re as RE, 
     a_au.stat as STAT 
FROM b_c 
JOIN c on b_c.c_id = c.id 
JOIN a on c.id = a.c_id 
JOIN a_au on a.id = a_au.id 
JOIN revi on a_au.rev = revi.rev 
JOIN (SELECT a.id as ID, 
       DATE(FROM_UNIXTIME(timestampCol)) as date, 
       MAX(a_au.re) as Max_RE 
      FROM b_c 
      JOIN c on b_c.c_id = c.id 
      JOIN a on c.id = a.c_id 
      JOIN a_au on a.id = a_au.id 
      JOIN revi on a_au.rev = revi.rev 
     WHERE b_c.b_id = 5 
     GROUP BY a.id, DATE(FROM_UNIXTIME(timestampCol))) x ON x.id = a.id 
                 AND x.date = DATE(FROM_UNIXTIME(timestampCol)) 
                 AND x.max_re = a_au.re 
WHERE b_c.b_id = 5 

可悲的是,MySQL不支持與可能已經變得更加容易這個有很多閱讀條款。

+0

我用你的SQL語句(我認爲它必須是x.Max_Re = a_au.re而不是x.max_re = a_au.re)。但現在我得到了這兩行數據: 31,10,'2010-07-14',2213,1 31,10,'2010-07-14',2213,1 所以我得到STAT 1 for ID 31和REV 2213,但其他行缺失,並且該行有兩次。沒有「x on x.id ...」的 – Tim 2010-07-14 17:32:52

+0

「: 31,10,'2010-07-14',2200,0 31,10,'2010-07-14',2205,0 31,10,'2010-07-14',2206,2 31,10,'2010-07-14',2207,0 31,10,'2010-07-14',2210,2 31,10,'2010-07-15',2211,0 31 ,10,'2010-07-14',2213,1 31,10,'2010-07-14',2200,0 31,10,'2010-07-14',2205,0 31,10 ,'2010-07-14',2206,2 31,10,'2010-07-14',2207,0 31,10,'2010-07-14',2210,2 31,10' 2010-07-15',2211,0 31,10,'2010-07-14',2213,1 32,10,'2010-07-14',2203,0 32,10,'2010- 07-14',2204,0 32,10,'2010-07-14',2208,2 32,10,'2010-07-14',2209,0 32,10,'2010-07-15',2212,2 – Tim 2010-07-14 18:18:08

+0

Add '1,2'到'x'子查詢。 – ceteras 2010-07-15 10:44:12