我在使用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

09-26 21:32