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作为平局破坏者。我想出了一种方法来做到这一点,但它涉及在同一个表上的几个查询并将它们连接在一起。我不禁想到有更好的解决方案。任何想法。
答案 0 :(得分: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
你基本上是这样说的,“给我所有的用户,其中没有其他用户在同一地区,并且有更多的积分或相同的积分以及更新的日期。”
答案 1 :(得分: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中的其他tiebreaking方法在http://sqlmag.com/t-sql/t-sql-tiebreakers
中讨论