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

标签 mysql sql pivot pivot-without-aggregate

我不是 MySQL 大师,但我很好地掌握了基本知识。感谢您的反馈。

我有两个表userfavorite。每个用户都可以拥有多个独特的收藏夹。

表用户u

[ user_id + name  ]
  100     | Sally

餐 table 最爱

[ 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 的工作方式相同,我只是想为您提供一个现场演示。

关于mysql - 在 MySQL 中,如何动态选择一个表的值作为另一个表中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9279518/

相关文章:

python - 在 python 中读取 SQL 表

sql - 数据透视查询中的 CSV 值

sql - 将 MySQL 结果集从行转换为列

python - Pandas 旋转数据框,重复行

mysql - 将三个电话号码之一存储为数据库中的主号码

php - LEFT JOIN 过滤最近 30 天加入的推荐人,而不是最近 30 天加入的推荐人

php - 如何使用 PHP 在一个表单中使用多个按钮?

php - XAMPP 管理器无法在 OS X 上启动服务器,但可以在终端上运行

Mysql大数据表查询

mysql - 获取今天在两列之间的记录