按排名对不同表格的结果进行分组

时间:2017-11-20 20:11:06

标签: mysql grouping ranking

我确定我不是第一个需要这样做的人,但我找不到一个类似的问题来解释细微差别。

我有3个表格( fav_food fav_color fav_place ),它们都遵循类似的模式:

userid   |   label    |  rank   |
=================================
1        | red        | 1
1        | green      | 2
1        | orange     | 3
2        | blue       | 1
2        | red        | 2
...

每个用户ID最多包含3个项目,但某些用户可能少于3个,而其他用户可能没有用于给定的表。即,它可能的用户10有2种喜欢的颜色,1种喜欢的食物和0种喜欢的地方。

我正在寻找可以输出我的数据的查询:

userid  |   fav_food  |  fav_place  |  fav_color  |  rank
===========================================================
1       | pizza       | New York    | red         | 1 
1       | burgers     | NULL        | green       | 2
1       | NULL        | NULL        | orange      | 3
2       | tacos       | Chicago     | blue        | 1
2       | burgers     | Orlando     | red         | 2
...

基本上,所有人都将1个项目放在一起,将2个项目放在一起,并将3个项目放在一起(NULLs不存在该等级的项目)。

我能够使用3个单独的查询(每个表一个)+在应用程序层进行后处理,但是为了我的个人知识库,我想知道是否有人知道如何在单一查询。

非常感谢!

1 个答案:

答案 0 :(得分:0)

@Isick,

您可以在每个表上使用LEFT OUTER JOIN执行此操作,直到仅包含用户ID和等级的表。 DEMO

 select user_rank.userid, user_rank.rank, f.food, p.place, c.color from 
 (
    select userid, rank from fav_food
    union
    select userid, rank from fav_place
    union
    select userid, rank from fav_color
    ) user_rank
left outer join 
( select userid, rank, label as food from fav_food) f
on user_rank.userid = f.userid and user_rank.rank = f.rank
left outer join 
( select userid, rank, label as place from fav_place) p
on user_rank.userid = p.userid and user_rank.rank = p.rank
left outer join 
( select userid, rank, label as color from fav_color) c
on user_rank.userid = c.userid and user_rank.rank = c.rank
order by userid, rank