1) "люди": mans (id, name) - 2 поля: первичный ключ и имя.
и 2 группы таблиц:
первая группа:
2) "машины": autos (id, name, mark_id) - 3 поля: первичный ключ, имя и ссылка на таблицу марок машин.
3) "марки машин": mark(id, name) - 2 поля: первичный ключ и название марки.
и вторая группа:
4) "телефоны" tels(number, color_id, is_worked) - 3 поля: номер - он же первичный ключ, ссылка на цвет и логический признак рабочий или нет.
5) "цвета": colors(id, name) - 2 поля: первичный ключ и название цвета.
И есть таблицы связи люди-машины и люди-телефоны:
mans_autos(id, man_id, auto_id)
mans_tels(id, man_id, tel_id)
Задача:
Надо выбрать всех людей, у которых нет машин марки "ВАЗ" и нет белого телефона...
Такой запрос:
SELECT mans.id
FROM mans
LEFT JOIN mans_autos ON mans_autos.man_id = mans.id
LEFT JOIN autos ON autos.id = mans_autos.auto_id
LEFT JOIN marks ON (marks.id = autos.mark_id AND marks.name = 'ВАЗ')
LEFT JOIN mans_tels ON mans_tels.man_id = mans.id
LEFT JOIN tels ON tels.id = mans_tels.tel_id
LEFT JOIN colors ON (color.id = tels.color_id AND colors.name = 'белый')
WHERE
colors.id IS NULL AND marks.id IS NULL
;
Выдает правильные результаты и достаточно быстро, но при этом получаю повторные значения, которые приходится устранять или добавкой DISTINCT или с помощью GROUP BY...
А ведь по правилам левого объединения повторных результатов быть вроде как не должно даже при наличии людей с несколькими "ВАЗ"ами и белыми телефонами...
Более того, если таблицы autos и marks объединять внутренним join, и аналогично поступить для таблиц tels и colors, то, вроде как объем перебираемых записей должен быть значительно меньше... но для этого надо указать порядок запросов...
вопрос: как?
погуглил и ничего внятного не нашел по вопросу множестенных join...
есть, кто может подсказать что-то?
П.С. в access поступал просто, там можно объединять подзапросы скобками... здесь - ругается на синтаксическую ошибку...
"Только так, только личная инициатива и напряженная работа над собой. .. Нужно своей собственной рукой все делать" (с) В.В. Путин(а не на "вертикаль власти" надеяться)