我在使用sql请求时遇到了一些麻烦。
这是我的桌子:
文字:
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可以帮助我吗?
最佳答案
如以上注释中所述,只需将表外部联接即可。
对于不止一个匹配项,我使用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。