【问题标题】:Max Players Per Day Group by Host每天最多玩家组(按主机)
【发布时间】:2017-09-05 18:27:10
【问题描述】:

我的 MySQL 查询有点问题

这是我的结构:

select * from servers group by host;


+-----+----------------------+---------+---------------------+
| id  | host                 | players | time                |
+-----+----------------------+---------+---------------------+
|   1 | 28.167.243.83:27035  |       3 | 2016-12-12 21:03:33 |
|   3 | 78.17.183.116:27015  |      10 | 2016-12-12 21:03:33 |
|  63 | 208.147.243.91:27025 |       1 | 2016-12-12 21:56:01 |
| 115 | 208.147.243.83:27035 |       2 | 2016-12-12 22:30:02 |
| 118 | 206.147.243.83:27035 |       2 | 2016-12-12 22:32:02 |
| 121 | 204.147.243.83:27035 |       2 | 2016-12-12 22:34:01 |
| 124 | 203.147.243.83:27035 |       2 | 2016-12-12 22:36:01 |
| 127 | 202.147.243.83:27035 |       2 | 2016-12-12 22:38:01 |
| 130 | 201.147.243.83:27035 |       2 | 2016-12-12 22:40:01 |
| 133 | 208.147.243.83:27035 |       2 | 2016-12-12 22:42:02 |
+-----+----------------------+---------+---------------------+

结果继续,因为每个主机每 5 分钟有一个新条目。

我希望它看起来像这样:

除了第二列应该是这样的:

unique date;max players on that unique date

并用逗号分隔每个唯一日期到最大玩家集

我如何通过查询来实现这一点?

截图查询:

SELECT host, TRIM(TRAILING ',' FROM GROUP_CONCAT(DISTINCT CONCAT(UNIX_TIMESTAMP(`time`) * 1000, ',', players) ORDER BY `time` ASC SEPARATOR ';')) AS datapoints FROM servers where `time` between date_sub(now(),INTERVAL 8 WEEK) and now() GROUP BY `host`

SQL 小提琴:http://sqlfiddle.com/#!9/a1350d

【问题讨论】:

  • 好的,但问题是什么?
  • @trailmax 我如何通过查询实现这一点?
  • @RumbleFrog 你想每天多于一个条目吗?
  • @DarshanMehta 每个主机?没有。

标签: mysql date group-by unique concat


【解决方案1】:

如果您希望用逗号连接列,您可以编写 GROUP BY 查询并将其包装到另一个查询中,例如:

SELECT a.host, CONCAT(a.`date`, ';', a.max_players)
FROM (
 SELECT 
     `host`,
     DATE_FORMAT(`time`,'%Y-%m-%d') as `date`,
     MAX(`players`) as 'max_players'
 FROM servers
 GROUP BY host, `date`
) a;

【讨论】:

  • 最后的a 是什么
  • FROM中定义的内表的别名。
  • 我可以使用组连接,像截图一样使用逗号分隔吗?
  • 是的,你可以把它包装成GROUP_CONCAT来得到需要的结果。
【解决方案2】:

试试这个:

SELECT
    `host`,
    GROUP_CONCAT(CONCAT(`day`,';',`max_players`)) as `info`
FROM (SELECT
        `host`,
        DATE_FORMAT(`time`,'%Y-%m-%d') as `day`,
        MAX(`players`) as `max_players`
    FROM `so_test_servers`
    GROUP BY `host`, `day`) as A
GROUP BY `host`

【讨论】:

  • 它有点工作,我如何分组 concat 这个以匹配示例截图?
  • 感谢它的工作,不幸的是我无法投票(没有足够的代表)。我的最终解决方案:sqlfiddle.com/#!9/a1350d/10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多