2013-08-16 5 views
-1

Я ищу способ сопоставить строки b/w две таблицы.Соответствие строк по столам

name_tokens 
----------------- 
product_id, tokens 
---------------- 
1, token 1 
1, token 2 
1, token 3 
2, token 1 
2, token 2 
3, token 1 
4, token 1 

----------- 
models_tokens 
--------------- 
product_id, tokens 
------------------ 
1, token 1 
1, token 2 
2, token 1 
3, token 1 
4, token 1 

Так в основном одна таблица содержит модели токенов продукта и другой содержит имя лексемы продукта. Я хочу получить все те продукты, чьи жетоны имен содержат все маркеры модели.

Пойдет так. 1.) Для каждого продукта посмотрите, сколько маркеров модели для продукта 2.) Проверьте маркеры имени для существования для каждого маркера модели этого продукта. Если да, то считается совпадение.

Надеюсь, я сделал scenerio прозрачным. Если бы не я, я бы попросил вопрос.

Редактировать

--------- 
name_tokens 
----------------- 
product_id, tokens 
---------------- 
1, hello 
1, world 
1, stackoverflow 
2, Stack 
2, overflow 
3, stack 
4, flow 

----------- 
models_tokens 
--------------- 
product_id, tokens 
------------------ 
1, hello 
1, stackoverflow 
2, ovreflow 
3, overflow 
4, stack 

Так результат мне нужно

product_id 
1 
2 
+0

В этом случае вы хотите получить идентификатор продукта '1' из' name_tokens'? –

+0

@ 491243 Я не использовал токен 1 для представления значения. Он просто говорит, что первый токен идет туда. Таким образом, идентификатор продукта 1 в случае, если токен 1 и токен 2 в обеих таблицах для этих продуктов имеют одинаковое значение. скажем, токен 1 «привет», а токен 2 - «мир» – Ankit

+0

Если все еще не ясно, пожалуйста, дайте мне знать. Я обновлю пример с помощью реальных данных – Ankit

ответ

1

Вы бы сделать это с помощью левого внешнего соединения и агрегации:

select nt.product_id 
from name_tokens nt left outer join 
    model_tokens mt 
    on nt.product_id = mt.product_id and 
     nt.tokens = mt.tokens 
group by nt.product_id 
having count(mt.product_id) = count(*); 

Что этот запрос делает начните с таблицы name_tokens и найдите все совпадения в model_tokens таблица. Если совпадений нет, то NULL присваивается строкам в mt (любезно предоставлено left outer join). Предложение having возвращает все продукты, которые имеют равное количество совпадений во второй таблице, так как в первом есть токены.

EDIT:

Для реверса, можно отменить запрос:

select mt.product_id 
from model_tokens mt left outer join 
    name_tokens nt 
    on nt.product_id = mt.product_id and 
     nt.tokens = mt.tokens 
group by mt.product_id 
having count(nt.product_id) = count(*); 

Обратите внимание, что пункт having изменений, а также порядок объединений и п group by.

+0

HI @Gordon Прежде всего, спасибо за то, что пришли с ответом. Но это, похоже, работает совершенно противоположно тому, что мне нужно. Он возвращает продукт, все токены которого указаны в токенах модели. Мне нужны продукты, чей маркер всех моделей существует в токенах имени. – Ankit

+0

Думаю, мне просто нужно переключить позиционирование стола. Еще раз спасибо. – Ankit

+0

Во втором решении должна быть группа mt.product_id? или я чего-то не хватает? – Ankit

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