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



我不是MySQL大师,但我能很好地解决基本问题。感谢您的反馈

我有两个表userfavorite。每个用户可以有多个唯一的收藏夹。

表格用户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查询和数据透视表

相关内容

  • 没有找到相关文章

最新更新