3

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

更新

所以这就是所谓的,旋转的,优秀的。

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

4

2 回答 2

4

像这样:

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

于 2012-02-14T15:31:26.027 回答
3

本质上你想要PIVOT功能。不幸的是,MySQL 本身并不支持这一点(与 Oracle 或 SQL Server 不同)。StackOverflow 上有很多问题展示了如何解决 MySQL 缺乏的功能:

https://stackoverflow.com/search?q=mysql+pivot+sql

一些例子:

于 2012-02-14T15:30:50.907 回答