Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MYSQL中,如何按列值分隔这些分组数据?_Mysql_Sql_Join_Group By - Fatal编程技术网

在MYSQL中,如何按列值分隔这些分组数据?

在MYSQL中,如何按列值分隔这些分组数据?,mysql,sql,join,group-by,Mysql,Sql,Join,Group By,我有一个具有以下结构的表: SELECT * FROM logs WHERE data = "Map load" ORDER BY timestamp DESC LIMIT 5 user_id timestamp data 3 2017-03-29 18:11:25 Map load 2 2017-03-29 18:10:11 Map load 5 2017-03-29 18:02:07 Map load 5 201

我有一个具有以下结构的表:

SELECT * FROM logs WHERE data = "Map load" 
ORDER BY timestamp DESC LIMIT 5

user_id timestamp            data
3       2017-03-29 18:11:25  Map load
2       2017-03-29 18:10:11  Map load
5       2017-03-29 18:02:07  Map load
5       2017-03-29 17:48:03  Map load
3       2017-03-29 17:38:48  Map load
我希望按15分钟的间隔将行分组,我已经这样做了。 但是,我还需要按用户id对这些数据进行分段

按间隔分组:

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/900)*900) AS `Time`,
COUNT(*) AS `Map Load` FROM logs 
WHERE data = "Map load"
GROUP BY `Time` ORDER BY `Time` DESC LIMIT 3

Time                Map Load
2017-03-29 18:00:00 3
2017-03-29 17:45:00 1
2017-03-29 17:30:00 1
预期结果布局:

Time                user_id=3 user_id=2 user_id=5
2017-03-29 18:00:00 1         1         1
2017-03-29 17:45:00 0         0         1
2017-03-29 17:30:00 1         0         0

我还有其他60个用户,因此除了在15分钟间隔时间戳上为每个用户id加入此表的副本外,还有其他方法可以做到这一点吗?

您可以使用条件聚合:

select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp) / 900) * 900) as time,
    sum(user_id = 3) as User_id_3,
    sum(user_id = 2) as User_id_2,
    sum(user_id = 5) as User_id_5
from logs
where data = "Map load"
group by time
order by time desc LIMIT 3
如果用户数量较多,最好不要在SQL中透视值,而是在应用程序代码中透视值:

select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp) / 900) * 900) as time,
    user_id,
    count(*) as cnt
from logs l
join (
    select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp) / 900) * 900) as time
    from logs
    group by time
    order by time desc limit 3
    ) t on FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp) / 900) * 900) = t.time
where data = 'Map load'
group by time,
    user_id
order by time desc;

这很好,但是对于60多个用户来说,随着更多用户的加入,线性增长的查询是否明智?我不确定这将是可维护的,除非有一种方法,我可以为每个用户的id生成<代码>从用户中选择用户id@Lawrence_1718-在这种情况下,不要在SQL中透视表数据。在应用程序代码中执行此操作。也更新了答案。谢谢你的建议,但我现在没有太多的选择,已经生成的数据需要这个,不过谢谢你的帮助!