2014-09-15 3 views
0

У меня есть проблемы с запросом sql.Сложный запрос 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 представляет идентификатор одной из таблиц ниже действия.

То, что я хочу сделать, это показать что-то вроде этого:

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

Также неясно, какая должна быть логика выбора gather_id, hunt_id, use_id и применения предложения GROUP BY в то же время – heximal

+0

Ну, вы присоединяетесь ко всем таблицам, а затем группируете их по text.component_kind и text.text. Просто попробуйте. –

ответ

0

Как уже упоминалось в комментариях выше, просто подключите внешние таблицы.

Я использую GROUP_CONCAT для случая, когда имеется более одного совпадения. В MySQL будет разрешено просто выбрать ig.item_id вместо group_concat(ig.item_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.