我不是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
值是什么,因此必须动态生成列名。
SELECT ...
[ user_id + name + fav_icecream + fav_candybar + fav_color ]
100 | Sally | mint | snickers | red
考虑到对性能的一些深思熟虑 - 其中一个问题是我不想运行两个SELECT
语句来获取用户数据和用户收藏(加上我喜欢有这样的想法)以这种方式动态命名的列。)
更新
所以这就是所谓的,旋转,非常好。
如果我不知道这些值是什么怎么办?我需要从收藏夹上的查询动态生成列。
答案 0 :(得分:4)
像这样:
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相同,我只是试着给你一个现场演示。
答案 1 :(得分:3)
基本上你想要PIVOT
功能。不幸的是,MySQL本身并不支持(与Oracle或SQL Server不同)。 StackOverflow上有很多问题,展示如何解决缺乏MySQL功能的问题:
https://stackoverflow.com/search?q=mysql+pivot+sql
一些例子: