2013-07-25 1 views
2

К этому моменту я реализую систему, которая выполняет сопоставление между 3 таблицами, и мне действительно нужна ваша помощь, предположим, что у меня есть следующие три таблицы:
SQL-запрос для отображения данных, которые точно соответствуют критериям в столбце другой таблицы

Table1: связь между именем и п

User  Item 
===================== 
John Doe Apple 
John Doe Orange 
John Doe Cat 
John Doe Dog 
John Doe Fish 
Anna Sue Apple 
Anna Sue Orange 
Robinson Banana 
Robinson Vessel 
Robinson Car 


Table2: Для того, чтобы классифицировать товар

Item Type Item 
================== 
Fruit  Apple 
Fruit  Orange 
Fruit  Banana 
Animal  Cat 
Animal  Dog 
Vehicle  Vessel 
Vehicle  Car 
Vehicle  Truck 


Таблица3: Matching пункта

Match ID Item Type 
====================== 
M001  Fruit 
M001  Animal 
M002  Fruit 
M002  Vehicle 


Все, что я хочу спросить, что как я могу только показать всех пользователей, имеющих все критерии, которые точно соответствуют с назначенным матча ID
Для этого случая пользователь John Doe, который соответствует всем критериям наличия предмета в пределах Плоды И животных, что отношения, назначенные в Match ID в следующем формате:

User   Match ID Item Type Item 
================================================ 
John Doe  M001  Fruit  Apple 
John Doe  M001  Fruit  Orange 
John Doe  M001  Animal  Cat 
John Doe  M001  Animal  Dog 
Robinson  M002  Fruit  Banana 
Robinson  M002  Vehicle  Vessel 
Robinson  M002  Vehicle  Car 

Все решения высоко ценятся, поэтому спасибо за вашу помощь.

+0

Да, но на самом деле только table1 - table3 другой - это только таблица результатов. Мне нужна логика запроса, которая может вместить все данные из 3 таблиц выше, чтобы генерировать результаты, подобные таблице результатов примера в конце моего сообщения. –

+0

В таблице вывода Строки для 'Anna Sue' не содержат. Есть ли какое-либо условие для этого? – Romesh

ответ

0

Для MySQL

fiddle

select t1.User,t3.MatchID,t3.ItemType as ItemType,t2.Item as Item 
from Table1 t1 
inner join Table2 t2 on t1.Item = t2.Item 
inner join Table3 t3 on t3.ItemType = t2.ItemType 
inner join 
(select user,MatchID 
from 
(SELECT GROUP_CONCAT(ItemType ORDER BY ItemType) AS typesTomatch , MatchID 
FROM Table3 GROUP BY MatchID) abc 
inner join 
(Select a.User, group_concat(distinct b.ItemType ORDER BY b.ItemType) 
as typesofpeople 
from Table1 As a 
inner join Table2 As b on a.Item = b.Item 
group by a.User order by b.ItemType) def 
on abc.typesTomatch = def.TYPESOFPEOPLE) xyz 
on xyz.User = t1.User and xyz.MatchID = t3.MatchID; 
+0

Это работает для меня, я дам вам знать, если у меня возникнут проблемы с логикой, которую вы предоставили позже. Большое спасибо. –

+0

всегда приветствуется bro –

0

попробовать это:

SELECT [User], [Match ID], [Item Type],[Item] 
From table1 
Inner join table2 on table1.item = table2.item 
Inner join table3 on table2.[item type]= table3.[item type] 
Where [User] = 'SOME USER NAME' AND table2.[item type] = 'SOME ITEM TYPE' AND table1.Item = 'SOME ITEM' 
+0

Спасибо за ваш ответ, так или иначе, я не хочу ограничивать пользователя только «Джон Доу», поскольку данные также огромны. Значит, я хочу показать всем пользователям, которые соответствуют критериям из этих трех таблиц. –

+0

Итак, каковы критерии, которые вы хотите? Можешь описать? –

+0

@AlvinFuryadi что-то вроде отредактированного запроса? –

0

Используйте это, его работали:

select t1.[User],t3.matchid,t3.item_type,t1.item from table3 t3 left join table2 t2 on t3.item_type=t2.Item_type left join table1 t1 on t2.Item=t1.Item where t1.[user]='JohnDoe' and t3.MatchId='m001' group by t1.[user],t1.item,t3.MatchId,t3.Item_Type 
+0

Что делать, если я хочу выбрать всех пользователей, которые соответствуют ID матча? –

+0

Проверьте это; выберите t1. [Пользователь], t3.matchid, t3.item_type, t1.item из таблицы3 t3 left join table2 t2 on t3.item_type = t2.Item_type left join table1 t1 на t2.Item = t1.Item где t1. [user] = 'JohnDoe' и t3.MatchId = 'm001' или t1. [Пользователь] = 'robinson' и t3.MatchId = 'm002' группа по t1. [user], t1.item, t3.MatchId, t3 .Item_Type – kabijoy

1

Вот один из способов сделать это, но это будет легкое затемнение запрос на больших наборах.

SQL Fiddle demo here: http://sqlfiddle.com/#!2/63cd2/1

SELECT ui.user_name 
    , tm.match_id 
    , tm.item_type 
    , ui.item 
    FROM (SELECT uu.user_name 
      , tm.match_id 
      , COUNT(DISTINCT tm.item_type) AS cnt_item_type 
      FROM (SELECT u.user_name FROM user_item u GROUP BY u.user_name) uu 
     CROSS 
      JOIN type_match tm 
     GROUP BY uu.user_name, tm.match_id 
     ) n 
    JOIN (SELECT hui.user_name 
      , htm.match_id 
      , COUNT(DISTINCT htm.item_type) AS cnt_item_type 
      FROM user_item hui 
      JOIN item_type hit ON hit.item = hui.item 
      JOIN type_match htm ON htm.item_type = hit.item_type 
     GROUP BY hui.user_name, htm.match_id 
     ) h 
    ON h.cnt_item_type = n.cnt_item_type 
    AND h.match_id  = n.match_id 
    AND h.user_name  = n.user_name 
    JOIN user_item ui 
    ON ui.user_name = h.user_name 
    JOIN item_type it 
    ON it.item = ui.item 
    JOIN type_match tm 
    ON tm.item_type = it.item_type 
    AND tm.match_id = h.match_id 
ORDER 
    BY ui.user_name 
    , tm.match_id 
    , tm.item_type 
    , ui.item 

Вида рядных псевдонимы, как n представляет то, что нужно пользователю иметь, все item_type, которые необходимы для того, чтобы удовлетворить каждый match_id.

Inline view aliased as h представляет, что на самом деле имеет пользователь, все элементы item_type, которые пользователь имеет для каждого match_id.

Мы можем получить счет отдельного элемента item_type в каждом из этих наборов и сравнить подсчеты. Если счетчик равен, то мы знаем, что у пользователя есть все необходимое item_type для этого match_id.

Наконец, мы можем присоединиться к этому вопросу, который пользователь имеет на самом деле, поэтому мы можем отобразить результат.

(Опять же, это будет ужасный световой диммер, хотя индексы помогут некоторым.)

+0

Это работает для меня, я сообщу вам, если у меня возникнут проблемы с логикой, которую вы предоставили позже. Большое спасибо. –

+0

это круто .. Другой подход. +1 от меня –

0

У вас есть недостаток в Table3: 2 идентификаторы (при условии, ItemType будет внешний ключ) для 1 данных (фрукты), в противном случае запрос будет:

select * 
from table1 
    join table2 using (item) 
    join table3 using (itemtype) 

если, конечно

  1. ItemType является таблица 2 первичный ключ

  2. ItemType является таблица 3 внешний ключ к таблице 2

  3. элемент таблицы 1 внешний ключ к таблице 2

+0

это не op просит? –

+0

Что вы подразумеваете под этим вопросом? – hanzpk

+0

Это не ответ на вопрос. (Если он был предназначен для ответа, он не отвечает на вопрос, который был задан.) Нет «недостатка в таблице3». Эта таблица явно является таблицей ассоциаций, чтобы разрешить отношения «многие ко многим» между «match» и «itemtype». – spencer7593

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