2013-11-30 4 views
1

У меня возникли трудности с решением одного упражнения:MySQL Relational Division

Для чего у людей есть ресторан, обслуживающий ВСЕ любимое пиво.

(Да, мы действительно имеем это в школе: D)

я получил 2 таблицы, которые могут быть использованы:

  • Table1: Favoritebeer (Имя, Фамилия, beername)
  • Table2 : OnStock (beername, ресторан, количество)

Мое решение будет: OnStock% Favoritebeer

В MySQL нет такой вещи, как DIVISION. Любые идеи, как я мог это решить? Я нашел следующее в Википедии: http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29, что именно то, что мне нужно, но у меня возникают трудности с его переводом в SQL.

EDIT:

Здесь выборочные данные: http://www.sqlfiddle.com/#!2/34e00

Результат должен быть:

Bucher Rolf 
Mastroyanni Pepe 
Meier Hans 
Meier Hanspeter 
Meier Hansruedi 
Müller Heinrich 
Peters Peter 
Zarro Darween 
+0

Можете ли вы переформулировать свой вопрос? Я не понимаю, что вы пытаетесь выполнить. – Babblo

+0

Возможно, добавьте некоторые данные примера на [sqlfiddle] (http://www.sqlfiddle.com) –

+1

Извините. Мой английский не очень хорош. У каждого клиента есть одно или несколько любимых пива. Теперь мне нужно найти всех клиентов, где есть ресторан, который обслуживает ВСЕ любимое пиво клиента. – Chris

ответ

3

Дайте этому попытку:

SELECT DISTINCT fb1.name, fb1.surname FROM favoriteBeer fb1 
JOIN stock s ON fb1.beerName = s.beerName 
GROUP BY fb1.name, fb1.surname, s.restaurant 
HAVING COUNT(*) = (
    SELECT COUNT(*) FROM favoriteBeer fb2 
    WHERE fb1.name = fb2.name AND fb1.surname = fb2.surname 
) 

Выход:

|  NAME | SURNAME | 
|-------------|-----------| 
|  Bucher |  Rolf | 
| Mastroyanni |  Pepe | 
|  Meier |  Hans | 
|  Meier | Hanspeter | 
|  Meier | Hansruedi | 
|  Müller | Heinrich | 
|  Peters |  Peter | 
|  Zarro | Darween | 

Fiddle here.

+0

Genius. Я попробовал подобное, но я всегда был сгруппирован по имени и фамилии. Никогда не брал ресторан в группу. И поэтому я всегда получал пустые наборы ... – Chris

+0

Правильно, он должен быть там. Во всяком случае, я уверен, что есть другие способы рассчитать это с помощью пары 'NOT IN' –