在MySQL中,如何动态选择一个表的值作为另一个表的列?
我不是MySQL大师,但我能很好地理解基本的东西。谢谢你的反馈 我有两张桌子,用户和收藏夹。每个用户可以有多个唯一的收藏夹 表用户u 表最爱 我想创建一个SELECT语句,使用fav_键值作为列标题,将用户的收藏夹转换为列*问题是我永远不知道fav_val值是什么,因为它们是用户输入的,所以列名必须动态生成 选择 考虑到性能问题,其中一个问题是我不想运行两个SELECT语句来获取用户数据和用户收藏夹,而且我喜欢以这种方式动态命名列 更新 这就是所谓的旋转,非常好 如果我不知道这些值是什么呢?我需要从收藏夹的查询中动态生成列 基本上,您需要PIVOT功能。不幸的是,与Oracle或SQL Server不同,MySQL本机不支持这一点。StackOverflow上有许多问题,说明如何解决MySQL功能不足的问题: 一些例子: 像这样:在MySQL中,如何动态选择一个表的值作为另一个表的列?,mysql,sql,pivot,pivot-without-aggregate,Mysql,Sql,Pivot,Pivot Without Aggregate,我不是MySQL大师,但我能很好地理解基本的东西。谢谢你的反馈 我有两张桌子,用户和收藏夹。每个用户可以有多个唯一的收藏夹 表用户u 表最爱 我想创建一个SELECT语句,使用fav_键值作为列标题,将用户的收藏夹转换为列*问题是我永远不知道fav_val值是什么,因为它们是用户输入的,所以列名必须动态生成 选择 考虑到性能问题,其中一个问题是我不想运行两个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
工作示例:
请注意:该演示是针对MS SQL Server的,但它对mysql的工作方式相同,我只是尝试给您一个实时演示。可能重复@Lukas_Eder,我不知道这被称为“数据透视”。我想如果我知道要查找什么关键字,那可能会有帮助。不过,我认为这个问题对不知道搜索内容的人仍然有用。问题是我不知道收藏夹的完整列表,只有知道这些值是什么时,这个问题才有效。@MGQ nice demo!这是我第一次在我的答案上得到一个代码演示,我甚至不知道你可以做这个+1。。。仍然需要动态生成的列尽管=]@qodeninja,这是一个普遍存在的问题,在MS SQL Server中有一个变通方法,对于mysql,也应该有变通方法,请尝试搜索具有动态列的mysql PIVOT表参见本文,例如,在SO中:
[ fav_id + user_id + fav_key + fav_val ]
1 | 100 | icecream | mint
2 | 100 | candybar | snickers
3 | 100 | color | red
[ user_id + name + fav_icecream + fav_candybar + fav_color ]
100 | Sally | mint | snickers | red
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