MySQL枢轴列

时间:2015-03-31 11:27:02

标签: mysql pivot

我希望根据MySQL中的用户ID将单列数据转换为多行 - 我更倾向于使用sql查询而不是外部工具。

我的具体情况似乎很简单,但我没有根据我找到的各种支点问题/答案/例子弄清楚。

这是我目前的表格:

╔════════╦═════════╦═════════╗
║ userID ║ object  ║  index  ║
╠════════╬═════════╣═════════╣
║ user1  ║ Apple   ║    1    ║
║ user1  ║ Orange  ║    2    ║
║ user1  ║ Pear    ║    3    ║
║ user2  ║ Kiwi    ║    1    ║
║ user2  ║ Melon   ║    2    ║
║ user2  ║ Mango   ║    3    ║
║ user3  ║ Apple   ║    1    ║
║ user3  ║ Melon   ║    2    ║
║ user3  ║ Pear    ║    3    ║
║ user3  ║ Mango   ║    4    ║
╚════════╩═════════╩═════════╝

这是理想的输出:

╔════════╦═════════╦═════════╦═════════╦═════════╗
║ userID ║    1    ║    2    ║    3    ║    4    ║
╠════════╬═════════╬═════════╬═════════╬═════════╣
║ user1  ║ Apple   ║ Orange  ║ Pear    ║ empty   ║
║ user2  ║ Kiwi    ║ Melon   ║ Mango   ║ empty   ║
║ user3  ║ Apple   ║ Melon   ║ Pear    ║ Mango   ║
╚════════╩═════════╩═════════╩═════════╩═════════╝

有几点需要注意:

  • 在userID之后的列应该是给定对象的索引 用户
  • 对象将以相同的顺序出现(我想这就是单个列/行枢轴的作用)
  • 每个userID的对象数量是可变的 - 列数应该与任何单个用户的最大对象数相匹配。在上面的示例中,user3有4个对象,因此我们在userID列之后有4列,即使其他用户的对象较少。当用户没有该列的数据时,我很高兴留下空白条目。

我确定这实际上非常简单,而且我在思考它。

编辑:我根据Gordon Linoff的评论略微编辑了表格,以包含我作为初始表格一部分的排序索引。

此外,基于戈登答案的同一问题的替代版本。

如果我事先知道我应该拥有的最大列数(在这个示例中为4对象)是否可以简化事情?例如在运行查询之前,我可以使用5列创建表。

1 个答案:

答案 0 :(得分:1)

由于两个重要原因,你无法随心所欲地做到:

  • SQL表表示无序集,因此除非列指定了排序,否则没有排序。
  • SQL语句中的列是固定的。

可能足够接近的是将所有值放在一列中:

select userId, group_concat(object)
from table t
group by userId;

您可以使用group_concat()separator修改order by以指定分隔符(默认逗号)或特定排序。

如果您确实需要可变数量的列,则必须使用动态SQL - prepareexec