Как мне выполнить простое объединение для нескольких таблиц?

#mysql #sql #join

#mysql #sql #Присоединиться

Вопрос:

У меня есть то, что, я уверен, является вполне решаемым вопросом, но я ни за что на свете не смогу заставить это простое соединение работать.

В принципе, у меня есть 3 таблицы:

  • ЧЛЕНЫ (first_name, last_name),
  • MEMBER_TO_GROUP(member_id,group_id)
  • ПЛАТЕЖИ (member_id, дата, сумма).

Я хочу получить все платежи от участников определенной группы. Используя только две таблицы, я могу найти все ПЛАТЕЖИ определенной группы без информации об участнике или я могу найти всю информацию о УЧАСТНИКЕ без информации о ПЛАТЕЖЕ. Однако, когда я пытаюсь добавить третью таблицу, возвращаются неверные данные (например, я получаю участников, не входящих в группу). Это основной запрос, который я использую:

 SELECT
    p.*,
    m.first_name,
    m.last_name
FROM
    members m,
    payments p,
    member_to_group mg
WHERE
    mg.group_id = 12
    AND mg.member_id = p.member_id
    AND m.member_id = p.member_id
 

Я не уверен, где находится разрыв, но любая помощь была бы очень признательна.

Комментарии:

1. Приобретите привычку использовать синтаксис соединения ANSI (как в ответе галадора). Это легче читать и часто подчеркивает ваши логические ошибки.

2. @Nick, это SQL89. Явное ОБЪЕДИНЕНИЕ — это SQL92 … 🙂

3. Неявные объединения, такие как используемые здесь, являются антишаблоном SQL. Этот плохой синтаксис был заменен в 1992 году чем-то более простым для чтения и обслуживания и с гораздо меньшей вероятностью случайных перекрестных соединений.

Ответ №1:

Я думаю, это должно получить то, что вы хотите:

 SELECT p.*,
       m.first_name,
       m.last_name
FROM payments p
INNER JOIN members m
  ON m.member_id = p.member_id
INNER JOIN member_to_group mg
  ON mg.member_id = m.member_id
WHERE mg.group_id = 12