2012-01-24 7 views
1

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

People 
1 Bob 
2 Mark 
3 Peter 
4 Tracy 
5 Robert 
6 ... 

Favorite_Food 
1 Icecream 
2 Fish&Chips 
3 Chocolate 
4 Pizza 

Pople_To_Favorite_Food 
1, 2 # Bob likes Fish&Chips. 
2, 2 # Mark likes Fish&Chips too. 
4, 2 
3, 3 
3, 2 
1, 1 # Bob likes Icevream. 
3, 1 
4, 1 
5, 3 

Что такое рекомендуемый способ реализовать следующий запрос:

  1. Выбор каждой любимой пищи Боба.
  2. Затем выберите каждого человека, который поделится хотя бы одной подобной любимой едой с Бобом.
  3. Список найденных имен.

Так что я ищу что-то вроде назад ссылка.

В этом примере это должно было бы привести к: Бобу нравится мороженое и рыба. &Chipy; Марк, Питер и Трейси, по крайней мере, одна еда, которую любит Боб. Итак, Марк, Питер и Трейси перечислены.

Я думал, что делать что-то вроде

SELECT fk_people_id FROM [...join the tables here...] WHERE favorit_food_id IN (
SELECT fk_favorite_food_id [...join the tables here...]) 

ли это путь, или есть более подходящее понятие, которое я должен использовать?

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

ответ

1

Попробуйте один -

SELECT p2.* FROM People p1 
    JOIN Pople_To_Favorite_Food pf1 
    ON pf1.people_id = p1.people_id 
    JOIN Favorite_Food f1 
    ON f1.food_id = pf1.food_id 
    JOIN Pople_To_Favorite_Food pf2 
    ON pf2.food_id = f1.food_id 
    JOIN People p2 
    ON p2.people_id = pf2.people_id 
WHERE 
    p1.name = 'Bob' 
GROUP BY 
    p2.people_id; 
+0

Это то, что я хотел. Спасибо! – Aufwind

0
-- This main query distinctly selects the record from people table which is joined 
-- to the favorite table and finds all ID's return from the subquery. 
SELECT DISTINCT peopleTable.peopleName 
FROM peopleTable INNER JOIN favoriteTable 
      ON on peopleTable.peopleID = favoriteTable.peopleID 
WHERE favoriteTable.foodID IN 
     (
      -- this subquery distinctly returns the favorite food of BOB 
      SELECT DISTINCT favoriteTable.foodID  
      FROM peopleTable INNER JOIN favoriteTable 
         ON peopleTable.peopleID = favoriteTable.peopleID 
      WHERE peopleTable.peopleName = 'BOB' 
     ) 
      AND 
     peopleTable.peopleName <> 'BOB' 
+0

Что '<>' означает? – Aufwind

+0

этот символ означает «НЕ РАВНО». это потому, что вы хотите выбрать все имя записи, кроме BOB. –

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