Как выбрать уникальные строки от одной до многих связанных таблиц в MySQL? - PullRequest
0 голосов
/ 03 августа 2011

Как MySQL-Noob, я изо всех сил пытаюсь решить следующую задачу: Предположим, 3 таблицы: location groceries и person со следующими свойствами:

  1. Каждая таблица имеет первичный автоинкрементный целочисленный идентификатор и столбец varchar.
  2. Все записи в таблицах уникальны.
  3. Каждая запись в groceries имеет внешний ключ записи в person.
  4. Возможно, что более одной записи из groceries используют один и тот же внешний ключ.
  5. (3) и (4) относятся к person и location тоже

Итак, мы имеем отношение многие к одному. Как выбрать каждую тройку (groceries_product, person_name, location_name), где person_name встречается не более одного раза?

Пример:

tables:  groceries                  | person      | location
------------------------------------ ------------- -------------------------
columns: id  product      person_id | id  name    | id  name  person_id
------------------------------------ ------------- -------------------------
         1   hamburger    1         | 1   Peter   | 1   home  1
         2   cheeseburger 1         | 2   Tom     | 2   work  1
         3   carot        1         |             | 3   zoo   2 
         4   potatoe      1         |             |
         5   mango        2         |             |

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

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Я думаю, что вы должны сделать отбор, чтобы получить свой результат:

SELECT groceries.product, person.name, location.name
FROM person
LEFT JOIN groceries ON person.id = groceries.person_id
LEFT JOIN location ON person.id = location.person_id
WHERE person.id
IN (
SELECT person.id
FROM person
LEFT JOIN groceries ON person.id = groceries.person_id
LEFT JOIN location ON person.id = location.person_id
GROUP BY person.id
HAVING count( person.id ) =1
)
0 голосов
/ 03 августа 2011
select l.name, m.name, r.name
from `left` l
left join middle m on m.id = l.middle_id
left join `right` r on m.id = r.middle_id;
...