困难的SQL请求

时间:2014-09-15 08:18:51

标签: mysql sql

我遇到了一些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都可以帮助我吗?

1 个答案:

答案 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