#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