【发布时间】:2015-12-28 06:09:09
【问题描述】:
我有一个关于 mySQL 数据库的非常复杂的 SQL 问题。 我将首先介绍这个问题所需的所有表格:
用户表:
Id date_created
------------------------------
1 2015-09-19T14:18:07.000Z
2 2015-09-20T01:16:34.000Z
3 2015-09-21T15:10:21.000Z
…
设置表:
Id User_id setting_key setting_value
----------------------------------------------
1 1 city 1
2 3 city 2
3 2 city 1
…
城市名称表:
Id name
------------------
1 New York
2 Los Angeles
3 Boston
…
通过选择查询我想实现这个:
date New York Los Angeles Boston …
------------------------------------------------------
2015-09-19 1 0 0
2015-09-20 2 0 0
2015-09-21 2 1 0
…
对于特定范围内的每个日期,有多少用户设置为纽约、洛杉矶、洛杉矶...... 我唯一能做到的就是这个查询:
select date(u.date_created), n.name, count(u.id)
from user u inner join setting s
on u.id = s.user_id
and setting_key = 'city'
inner join name n
on s.setting_value = n.id
where u.date_created > '2015-09-19T14:18:07.000Z'
group by 1, 2
但是我得到了这个结果:
date name count
-------------------------------
2015-09-19 New York 1
2015-09-19 Los Angeles 0
2015-09-19 Boston 0
2015-09-20 New York 1
2015-09-20 Los Angeles 0
2015-09-20 Boston 0
2015-09-21 New York 0
2015-09-21 Los Angeles 1
2015-09-21 Boston 0
…
不是累积的,每个城市都有一行,而不是每个城市的列。有人知道(复杂的)答案吗?如果有不清楚的地方问一下,在现实生活中,这些是 50.000 行的表,我无法更改结构,我需要此查询用于分析目的
【问题讨论】:
-
如果您不需要动态列,这也可能会有所帮助。 stackoverflow.com/questions/7674786/mysql-pivot-table
-
你知道你想显示的城市的名字,还是动态的?另外,您是否知道每个用户的最大城市数,还是动态的?
-
我知道城市的名称,但它会随着时间的推移而变化,所以最好是动态的
-
这不是你建议的问题的重复,因为我也需要它是累积的