融智技术学院

 找回密码
 注册
查看: 415|回复: 2

【数据库每日一问】在SQL选择行时使用MAX(列值)函数,另一列使用DISTINCT??

[复制链接]
MrLi 发表于 2014-3-5 14:00:02 | 显示全部楼层 |阅读模式
问:我的数据表如下所示
  1. id  home  datetime     player   resource
  2. ---|-----|------------|--------|---------
  3. 1  | 10  | 04/03/2009 | john   | 399
  4. 2  | 11  | 04/03/2009 | juliet | 244
  5. 5  | 12  | 04/03/2009 | borat  | 555
  6. 3  | 10  | 03/03/2009 | john   | 300
  7. 4  | 11  | 03/03/2009 | juliet | 200
  8. 6  | 12  | 03/03/2009 | borat  | 500
  9. 7  | 13  | 24/12/2008 | borat  | 600
  10. 8  | 13  | 01/01/2009 | borat  | 700
复制代码
我需要选择每个不同的“home”找出“datetime”的最大值。
结果将是:
  1. id  home  datetime     player   resource
  2. ---|-----|------------|--------|---------
  3. 1  | 10  | 04/03/2009 | john   | 399
  4. 2  | 11  | 04/03/2009 | juliet | 244
  5. 5  | 12  | 04/03/2009 | borat  | 555
  6. 8  | 13  | 01/01/2009 | borat  | 700
复制代码

我尝试的:
  1. // 1 ..by the MySQL manual:

  2. SELECT DISTINCT home, id, datetime as dt, player, resource
  3.     FROM topten t1
  4.     WHERE datetime = (SELECT MAX(t2.datetime) FROM topten t2
  5.         GROUP BY home )
  6. GROUP BY datetime
  7. ORDER BY datetime DESC
复制代码
并不正确。结果集有130行,尽管数据库包含187。结果包括“home”的一些重复值。

  1. // 2 ..join

  2. SELECT s1.id, s1.home, s1.datetime, s1.player, s1.resource
  3. FROM topten s1 JOIN
  4. (SELECT id, MAX(datetime) AS dt
  5.   FROM topten
  6.   GROUP BY id) AS s2
  7.   ON s1.id = s2.id
  8.   ORDER BY datetime
复制代码

不对. 给出所有的记录
  1. // 3 ..something exotic:
复制代码


各种结果。

答:
You are so close! All you need to do is select BOTH the home and it's max date time, then join back to the topten table on BOTH fields:
你是如此接近正确的答案!所有您需要做的是选择home和它的最大日期时间,然后连接查询返回所有字段:
  1. SELECT tt.*
  2. FROM topten tt
  3. INNER JOIN
  4.     (
  5.     SELECT home, MAX(datetime) AS MaxDateTime
  6.     FROM topten
  7.     GROUP BY home
  8.     ) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime
复制代码
IT小宅男 发表于 2014-3-15 19:06:47 | 显示全部楼层
不知道怎么弄
5937562aaa 发表于 2014-4-20 09:05:35 | 显示全部楼层
SELECT a.id, a.home, a.datetime, a.player, a.resource

FROM topten a JOIN

(SELECT id, MAX(datetime) AS dt

  FROM topten

  GROUP BY id) AS b

  ON a.id = b.id

  ORDER BY datetime
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新突破电商

小黑屋|手机版|Archiver|融智技术学院 ( 京ICP备09018999号 )

GMT+8, 2019-8-26 11:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表