【问题标题】:In MySQL, How do you dynamically SELECT the values of one table, as columns in another?在 MySQL 中,如何动态选择一个表的值作为另一个表中的列?
【发布时间】:2012-03-29 08:03:34
【问题描述】:

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

更新

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

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

【问题讨论】:

  • pivot in mysql queries 的可能重复项
  • @Lukas_Eder 我不知道这被称为旋转。我想如果我知道要查找什么关键字,那可能会有所帮助。但是我认为这个问题对于不知道要搜索什么的人仍然有用

标签: mysql sql pivot pivot-without-aggregate


【解决方案1】:

像这样:

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

【讨论】:

  • 问题是我不会知道收藏夹的完整列表,这只有在我知道值是什么时才有效。
  • @MGQ 不错的演示!这是我第一次得到关于我的答案的代码演示,我什至不知道你可以做到这一点 +1 ...虽然仍然需要动态生成的列 =]
  • @qodeninja,这是一个流行的问题,(在 MS SQL Server 中)有一个解决方法,对于 mysql 也应该有解决方法,尝试搜索 Mysql PIVOT Table with dynamic columns 例如在 SO 中看到这篇文章:stackoverflow.com/questions/6158230/…
【解决方案2】:

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

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

一些例子:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2016-09-28
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多