0

好的。我有由 TRAVIAN 游戏中使用的数据制成的数据库。我有 200000 行,所以我想减少它以进行 Excel 分析。

x   y   village player alliance population  date
27 -41  h1      h       S       35          2009-12-23
27 -41  h1      h       S       56          2009-12-24
27 -41  h1      h       S       60          2009-12-25
27 -41  h1      h       S       89          2009-12-26

这些只是表中的一些重要属性。每次玩家登录系统时,每个村庄都会有很多其他条目。所以你可以看到每个村庄的人口增长。我只想写一个 sql 语句,它只返回村庄最大人口所在的条目。(当然是每个村庄)。

我写了这样的东西

SELECT * 
FROM x_world
GROUP BY village
HAVING population = max(population)

从理论上讲,我想遍历每个村庄并搜索其最大的人口条目,然后只取那个。我想为每个村庄做这件事。这也是我如何将村庄总数。

4

3 回答 3

1

使用联接尝试此查询。它比依赖子查询快得多。

SELECT 
    * 
FROM x_world as xr
INNER JOIN (
        SELECT 
                x,
                MAX(population)
        FROM x_world as xr
        GROUP BY x 
) as xt ON xt.x = xr.x
GROUP BY village

演示

于 2013-01-05T17:49:18.400 回答
0
SELECT *
FROM x_world
GROUP BY village
HAVING SUM(population)=
  (SELECT MAX(a.population)
  FROM
    (SELECT village,SUM(population) population FROM x_world GROUP BY village
    ) a
  )

SQL_LIVE_DEMO

于 2013-01-05T17:47:07.717 回答
0

你想要的是这样的:

select *
from x_world w
where population = (select max(population) from x_world w2 where w2.village = w.village)

注意:当村庄的最大人口数超过一个时,这将返回多行。

实际上,这可以通过以下方式在 MySQL 中修复:

select *
from x_world w
where population = (select max(population) from x_world w2 where w2.village = w.village)
group by village

但是,这利用了隐藏列,因此不能保证这些列来自同一行(尽管实际上它们似乎是)。

要获得一行,有一个 id 会很有帮助。从您的示例中, date 将适用于此,产生类似以下的查询:

select *
form x_world w join
     (select village, max(population) as maxpop,
             substring_index(group_concat(date_format(date, '%Y%m%d'), ',') as maxdate
      from x_world
     ) wmax
     on w.village = wmax.village and
        w.population = wmax.population and
        date_format(w.date, '%Y%m%d') = wmax.date
于 2013-01-05T17:50:53.237 回答