2009-11-09 25 views
1
 
User  Region Points Last_Updated   
1  5  0  1-Nov-09  I want this row 
2  1  5  30-Oct-09   
3  1  2  02-Nov-09   
2  2  7  02-Nov-09  and this row 
3  2  5  02-Nov-09   

使用MySQL數據庫,我想抓住所有的點領導爲每個區域由區域X到區域Y倘若點被追平,我想用last_updated作爲決勝盤。我想出了一個辦法來做到這一點,但它涉及同一張桌子上的幾個查詢,並將它們連接在一起。我不禁想到有一個更好的解決方案。有任何想法嗎。MySQL的:查詢發現一行用最大決勝

+0

感謝格雷格的編輯討論! – Codezy 2009-11-09 19:41:34

回答

4

這應該工作:

SELECT 
    T1.User 
FROM 
    MyUnnamedTable T1 
LEFT OUTER JOIN MyUnnamedTable T2 ON 
    T2.Region = T1.Region AND 
    (
      T2.Points > T1.Points OR 
      (T2.Points = T1.Points AND T2.Last_Updated > T1.Last_Updated) 
    ) 
WHERE 
    T2.User IS NULL AND 
    T1.Region BETWEEN x AND y 

你基本上說,「給我的所有用戶對於其存在誰是在同一地區沒有其他用戶,要麼有更多的點或相同點隨後更新日期。「

+0

是的,工作很好,謝謝! – Codezy 2009-11-09 19:51:34

+0

它總是讓我感到驚訝,有些人可以在SQL中表現得多好;而且我也不認爲我很糟糕!目前試圖做類似的事情,這將是一個很大的幫助。 – Dave 2010-01-12 10:05:42

0

這裏是另一種選擇:

SELECT T1.[User] 
FROM MyUnnamedTable T1 INNER JOIN (select MAX(points*100000000+convert(varchar(8),last_updated,112)) as score, region 
              from MyUnnamedTable 
              group by region) t2 ON T2.Region = T1.Region AND (t1.points*100000000+convert(varchar(8),t1.last_updated,112))=score 
WHERE T1.Region BETWEEN x AND y 

在嵌套查詢中,我們選擇分LAST_UPDATE的組合的最大。通過對最重要的數字中的點進行編碼,我們給予更高的優先級。如果有平局,那麼包含last_update的較低數字將打破平局。在SQL

其他的打破平局方法在http://sqlmag.com/t-sql/t-sql-tiebreakers