在MySQL中,如何动态选择一个表的值作为另一个表的列?

在MySQL中,如何动态选择一个表的值作为另一个表的列?,mysql,sql,pivot,pivot-without-aggregate,Mysql,Sql,Pivot,Pivot Without Aggregate,我不是MySQL大师,但我能很好地理解基本的东西。谢谢你的反馈 我有两张桌子,用户和收藏夹。每个用户可以有多个唯一的收藏夹 表用户u 表最爱 我想创建一个SELECT语句,使用fav_键值作为列标题,将用户的收藏夹转换为列*问题是我永远不知道fav_val值是什么,因为它们是用户输入的,所以列名必须动态生成 选择 考虑到性能问题,其中一个问题是我不想运行两个SELECT语句来获取用户数据和用户收藏夹,而且我喜欢以这种方式动态命名列 更新 这就是所谓的旋转,非常好 如果我不知道这些值是什么呢?我需

我不是MySQL大师,但我能很好地理解基本的东西。谢谢你的反馈

我有两张桌子,用户和收藏夹。每个用户可以有多个唯一的收藏夹

表用户u

表最爱

我想创建一个SELECT语句,使用fav_键值作为列标题,将用户的收藏夹转换为列*问题是我永远不知道fav_val值是什么,因为它们是用户输入的,所以列名必须动态生成

选择

考虑到性能问题,其中一个问题是我不想运行两个SELECT语句来获取用户数据和用户收藏夹,而且我喜欢以这种方式动态命名列

更新

这就是所谓的旋转,非常好

如果我不知道这些值是什么呢?我需要从收藏夹的查询中动态生成列

基本上,您需要PIVOT功能。不幸的是,与Oracle或SQL Server不同,MySQL本机不支持这一点。StackOverflow上有许多问题,说明如何解决MySQL功能不足的问题:

一些例子:

像这样:

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