2013-07-16 5 views
1

Table1 имеет tag1, tag2, tag3, tag4 ... к tag15
Table2 имеет tag1, tag2, tag3, tag4 ... к tag15Сравнение нескольких столбцов для нескольких столбцов в 2-х таблиц

Мне нужен SQL оператор выбора, чтобы вытащить все записи, в которых соответствуют ЛЮБЫЕ теги.

Tong способом было бы что-то вроде:

SELECT table1.* 
WHERE table1.tag1 = table2.tag1 
    OR table1.tag1 = table2.tag2 
    OR table1.tag1 = table2.tag3 

(. Для каждого тега)

Любой эффективный способ сделать это?

+0

Я думаю, что 225 утверждений - это ваш единственный способ ... если вы разместите свою схему, мы, вероятно, можем дать вам более удобный способ хранения ваших данных. – Orangepill

+0

Можете ли вы разместить некоторые данные образца? Трудно попытаться выяснить, что может работать, не зная, как выглядят данные. – andrewsi

+0

Нет эффективного способа, но цикл for сделает трюк, например '' tag '. $ I' –

ответ

2

У вас есть паршивая структура данных. Теги должны храниться в отдельной таблице с одной строкой на элемент и тегом - поэтому в данной строке может быть 15 тегов. Тогда запрос будет довольно простым.

Один из способов упростить запрос является использование in:

select * 
from table1 t1 join 
    tabl2 t2 
    on t1.tag1 in (t2.tag1, t2.tag3, . . . , t2.tag15) or 
     t1.tag2 in (. . .) or 
     . . . 

Я думаю, что это будет работать даже для NULL значений в тегах.

EDIT:

разделенный запятыми список еще хуже, чем отдельные столбцы. В MySQL, вы можете сделать:

on find_in_set(substring_index(t1.tags, ',', 1), t2.tags) > 0 or 
    find_in_set(substring_index(substring_index(t1.tags, ',', 2), -1), t2.tags) > 0 or 
    find_in_set(substring_index(substring_index(t1.tags, ',', 3), -1), t2.tags) > 0 or 
    . . . 

Правильный путь должен иметь две таблицы со столбцами, как:

  • Table1id
  • Tag

И

  • Таблица2id
  • тег

Тогда запрос:

select * 
from table1tags t1t join 
    table2tags t2t 
    on t1t.tag = t2t.tag; 

Намного проще, чем другие альтернативы.

+0

Я фактически упростил свои таблицы (все еще не очень хорошая структура данных, я знаю), но у меня есть теги в 1 поле с запятой, если table1 и table2. Как использовать IN для сравнения любого слова в table1.tags с любым словом в table2.tags? –

+0

спасибо. Я переделываю таблицы –

0

Используйте оператор IN.

SELECT table1.* FROM table1 
JOIN table2 
WHERE table1.tag1 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR 
table1.tag2 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR 
table1.tag3 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR 
... 
... 
table1.tag15 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) 

Это то же самое, как говорят

WHERE 
table1.tag1 = table2.tag1 OR 
table1.tag1 = table2.tag2 OR 
... 
table1.tag2 = table2.tag2 OR 
... 
table1.tag2 = table2.tag15 OR 
... 
table1.tag15 = table2.tag15 

только намного меньше линий.

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