MySQL根据另一个属性分组的一个属性进入列

时间:2014-12-25 06:52:43

标签: mysql pivot

考虑一下,我有一个像这样的数据库。


UserID |项目

  • 1 |面包
  • 1 |乳
  • 1 |脂
  • 1 |啤酒
  • 2 |面包
  • 2 |脂
  • 2 |水
  • 2 |果酱
  • 2 |啤酒

现在,我希望将其视为如下所示,以便轻松完成数据挖掘。 Itemset是动态的。

UserID | Item1 | Item2 | Item3 | Item4 | ITEM5

  • 1 |面包|牛奶|黄油|啤酒| NULL
  • 2 |面包|黄油|水|果酱|啤酒

我想知道初始数据库设计是否适合获取上表。即我想将用户购买的物品分组。根据我的要求,为每个用户分组的用户购买的每个项目创建一个包含多个列的视图。我使用MySQL作为我的数据库。

2 个答案:

答案 0 :(得分:0)

我使用MySQL变量来解决这个问题。它目前只设置为通用枢轴中的5个最终项目,但您显然可以通过模式进行扩展。这里的前提是内部查询将基于每个用户+项目撤回行,以便对项目进行排序并为返回的每一行分配一个序列号。然后通过max(case / when)的外部查询将返回该项,如果它是为该人找到的第一,第二,第三等项目。

select
      pq.userid,
      max( case when pq.holdseq = 1 then pq.items end ) as Item1,
      max( case when pq.holdseq = 2 then pq.items end ) as Item2,
      max( case when pq.holdseq = 3 then pq.items end ) as Item3,
      max( case when pq.holdseq = 4 then pq.items end ) as Item4,
      max( case when pq.holdseq = 5 then pq.items end ) as Item5
   from
      ( select
              UIT.userid, 
              UIT.items,
              @lastSeq := if( UIT.userid = @lastUser, @lastSeq +1, 1 ) as holdSeq,
              @lastUser := UIT.userid lastUser
           from
              YourUserItemsTable UIT,
              ( select @lastUser := 0, @lastSeq := 0 ) sqlvars
           order by
              UIT.userid,
              UIT.items ) pq
   group by
      UIT.userid

如果您希望输入自然顺序中的项目,请按"项目"删除订单。组件,但仍然没有基于索引的保证哪个记录将按什么顺序提取,但我们仍需要保持用户订购。

答案 1 :(得分:-1)

SELECT  USERID , Items FROM tbl_name where USERID = 1;
SELECT  USERID , Items FROM tbl_name where USERID = 2;

这是可能的方法之一,但你应该查询mysql 2次。 我建议使用orderby。

SELECT USERID , Items FROM tbl_name orderby USERID;

并且您的脚本语言检查USERID是否为1然后将项目放在array1中,否则将它们放在array2中。

两种选择都有效。