我遇到了一些sql请求的麻烦。
以下是我的表格:
text:
id component_kind text
56 4 a
19 4 a
10 4 a
1 6 b
行动:
id text_id detail_id detail_type
1 56 2 ItemGather
2 19 5 MonsterHunt
3 10 6 ItemUse
ItemGather:
id item_id count
2 1020 3
MonsterHunt:
id npc_id count
5 256 10
ItemUse:
id item_id count
6 3241 1
如您所见,act.text_id是text.id的外键,act.detail_id表示下面其中一个表的id。
我想做的是展示这样的东西:
component_kind text gather_id gather_count use_id use_count hunt_id hunt_count
4 a 1020 3 3241 1 256 10
6 b 0 0 0 0 0 0
我不知道在我的请求中要写什么。任何sql pro都可以帮助我吗?
答案 0 :(得分:0)
如上面的评论所述,只需外连接表。
对于有多个匹配的情况,我使用GROUP_CONCAT。在MySQL中,可以简单地选择ig.item_id
而不是group_concat(ig.item_id)
,这样可以在有多个时为您提供随机ID。在这种情况下,这取决于你想要展示的内容。
当没有匹配记录时,我使用COALESCE显示0而不是NULL。
select
t.component_kind,
t.text,
group_concat(ig.item_id) as gather_ids,
coalesce(sum(ig.count),0) as gather_count,
group_concat(iu.item_id) as use_ids,
coalesce(sum(iu.count),0) as use_count,
group_concat(mh.npc_id) as hunt_is,
coalesce(sum(mh.count),0) as hunt_count
from text t
left outer join act a on a.text_id = t.id
left outer join itemgather ig on ig.id = a.detail_id and a.detail_type = 'ItemGather'
left outer join monsterhunt mh on mh.id = a.detail_id and a.detail_type = 'MonsterHunt'
left outer join itemuse iu on iu.id = a.detail_id and a.detail_type = 'ItemUse'
group by t.component_kind, t.text;
这是SQL小提琴:http://sqlfiddle.com/#!2/00cfb/10。