我确定我不是第一个需要这样做的人,但我找不到一个类似的问题来解释细微差别。
我有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个单独的查询(每个表一个)+在应用程序层进行后处理,但是为了我的个人知识库,我想知道是否有人知道如何在单一查询。
非常感谢!
答案 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