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

我不是MySQL大师,但我很好地解决了基本问题.感谢您的反馈意见.

我有两个表用户和最喜欢的.每个用户可以拥有多个唯一的收藏夹

表用户你

[ 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语句来获取用户数据和用户收藏夹(另外我喜欢以这种方式动态命名列的想法) ).

UPDATE

因此,这称为旋转,非常好.

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

解决方法:

像这样:

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相同,我只是试着给你一个现场演示.

上一篇:mysql – SQL / Knime – 使用“分组依据”转置表


下一篇:JDK:CharacterData和CharacterDataLatin1