2015-09-12 1 views
0

Мы упрощаем и организуем грязную систему таксономии. У меня есть около 100 уникальных терминов через три источника поля таблицы, которые должны генерировать новые термины в различных областях выходного стола (три поля вывода, около 8 членов, каждый)MySQL, может ли таблица назначения быть названа по запросу?

source_table 
id | term1   | term2 | term3 
1 | Iraq   |   | 
2 | Asia   |   | Economy 
3 | Wall St  | Asia | 
4 | France  | Economy | US News 
5 | Daily Report | Labor | 

lookup_table 
id | in_term   | output_field | output_term 
1 | Iraq    | regions  | Middle East 
2 | Asia    | regions  | Asia 
3 | Wall St   | topics   | Economy 
4 | France   | regions  | Europe 
5 | Daily Report  | shows   | The Daily Report 
6 | Economy   | topics   | Economy 
7 | Labor   | topics   | Labor 
8 | US News   | regions  | North America 

output_table 
id | regions    | topics | shows 
1 | Middle East   |   | 
2 | Asia     | Economy | 
3 | Asia     | Economy | 
4 | Europe, North America | Economy | 
5 |      | Labor | The Daily Report 

Есть ли способ, чтобы иметь заданный выход поле будет создано из поиска, или мне нужно будет делать отдельные проходы обновления для каждого поля вывода? И как бы я структурировал эту команду в любом случае?

Решение MySQL предпочтительнее, но если оно должно быть реализовано в PHP, это тоже было бы.

+0

действительно непонятно, какой выход необходим. – noonex

+0

Вывод должен перейти в заданное поле в выходной таблице. Но заданное поле вывода зависит от входного слова. То есть, если вводным термином является «Ирак», поле выходной таблицы будет «регионом», а выходным термином будет «Ближний Восток». – Slam

+0

Непонятно, почему lookup_table, похоже, имеет идентификаторы столбцов и output_term - будет ли ваша задача еще достижима без этих столбцов? – noonex

ответ

0

В случае, если я правильно понимаю, и если output_term не поле от lookup_table и вы должны присоединиться источник и вывод с помощью ID:

select case output_field 
    when 'regions' then regions 
    when 'topics' then topics 
    else shows end 
from source_table join output_table using(id) 
join lookup_table on term1=in_term 
where source_table.id = 1; 
+0

Я думаю, что это очень близко! Все, что нужно - это использовать lookup_table.output_terms в полях output_table. И последняя строка - разве это не означает, что это будет работать только с первой входной строкой? – Slam

0

Я добавлю еще одну попытку, при условии, что «output_table» не вводится данных, но фактическая необходимая мощность:

select id, l1.output_term regions, l2.output_term topics, l3.output_term shows 
from source_table 
left join lookup_table l1 on l1.output_field='regions' 
      and l1.in_term in (term1, term2, term3) 
left join lookup_table l2 on l2.output_field='topics' 
      and l2.in_term in (term1, term2, term3) 
left join lookup_table l3 on l3.output_field='shows' 
      and l3.in_term in (term1, term2, term3); 
0

Я закончил тем, что делал это в трех различных запросов, по одному на out_field, потому что я нашел входную таблицу, чтобы быть очень тонким данных, и я в конечном итоге с неполными рядами на выходе, белый ru Мне нужны завершенные строки. Выполнение запросов по отдельности с помощью output_field позволило мне отслеживать количество результатов и посмотреть, насколько сильно были результаты. Также моя output_table уже существовала, поэтому я запускал ее как ОБНОВЛЕНИЕ.

UPDATE output_table out 
INNER JOIN (SELECT source_table.id AS sid, GROUP_CONCAT(out_term) AS terms 
FROM source_table source 
    INNER JOIN input_table 
    ON (in.in_term=source.t1 
    OR in.in_term=source.t2 
    OR in.in_term=source.t3) 
    AND output_field='regions' 
    GROUP BY sid) AS map 
ON map.sid=out.id 
SET out.regions = map.terms; 

Запросы по темам и шоу работали точно так же.

В последующих запросах я мог бы захватить все выходные_таблицы, например WHERE region IS NULL, и снова выполнить указанный выше запрос, но вместо сопоставления на input_terms я мог бы сопоставлять заголовки, теги, теги или другие поля, надеясь найти случайное совпадение поэтому я мог бы добавить тег области, где ни один не был найден в input_terms.

Смежные вопросы