我不是MySQL大师,但我能很好地解决基本问题。感谢您的反馈
我有两个表user
和favorite
。每个用户可以有多个唯一的收藏夹。
表格用户u
[ user_id + name ]
100 | Sally
表中最受欢迎的收藏夹
[ fav_id + user_id + fav_key + fav_val ]
1 | 100 | icecream | mint
2 | 100 | candybar | snickers
3 | 100 | color | red
我想创建一个SELECT
语句,使用fav_key
值作为列标题将用户的收藏夹转换为列*问题是,我永远不知道fav_val
值是什么,因为这些值是用户输入的,所以列名必须动态生成。
选择
[ user_id + name + fav_icecream + fav_candybar + fav_color ]
100 | Sally | mint | snickers | red
考虑到性能方面的一些遥远的想法——其中一个问题是,我不想运行两个SELECT
语句来获取用户数据和用户收藏夹(另外,我喜欢以这种方式动态命名列的想法)。
更新
所以这被称为,旋转,优秀。
如果我不知道价值观是什么呢?我需要从对收藏夹的查询中动态生成列。
像这样:
Select fav.user_id, u.name
MAX(case WHEN fav.fav_key = 'icecream' then fav.fav_val end) as 'fav_icecream',
MAX(case WHEN fav.fav_key = 'candybar' then fav.fav_val end) as 'fav_candybar',
MAX(case WHEN fav.fav_key = 'color' then fav.fav_val end) as 'fav_color'
From favorite fav
inner join users u on fav.user_id = u.user_id
group by fav.user_id
工作示例:DEMO
注意:这个演示是针对MS SQL Server的,但它对mysql的工作方式相同,我只是试着给你一个实时演示。
本质上您需要PIVOT
功能。不幸的是,MySQL(与Oracle或SQL Server不同)并不支持这一点。StackOverflow上有很多问题,显示了如何解决MySQL缺乏功能的问题:
https://stackoverflow.com/search?q=mysql+pivot+sql
一些例子:
- mysql查询中的pivot
- MySQL查询和数据透视表