Решение на самом деле довольно простое. Это включает добавление условия к предложению ON. От:
http://opensourceanalytics.com/2006/07/29/advanced-mysql-join-tips-tricks/
Теперь предположим, что вы хотите выполнять поиск не по всей таблице2, а по подмножеству таблицы2 (скажем, CityID = 1). Как ты это делаешь? Вы можете сами убедиться, что следующий SQL не является решением:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL
and table2.CityID = 1
Обратите внимание, что это потому, что мы ищем записи, которые не существуют в таблице 2 и, следовательно, не могут иметь предложение where для данных таблицы 2.
Прочтите страницу руководства чуть дальше, и другой пользовательский комментарий указывает:
Conditions for the “right table” go in the ON clause.
Conditions for the “left table” go in the WHERE clause,
except for the joining conditions themselves.
Это делает решение следующим образом:
SELECT table1.* FROM table1 LEFT JOIN table2 ON (table1.id=table2.id and table2.CityID = 1)
WHERE table2.id IS NULL
Итак, решение моего исходного запроса выглядит примерно так: (проверенный рабочий запрос)
SELECT DISTINCT contacts.contactID,
sum(hours) as hours,
contacts.first,
contacts.last,
contacts.graduates from contacts
left join comm_stud using (contactID)
left join comm_svc using (csID)
(Это секретный соус:)
left join tbl_yeardiv on (comm_svc.termID = tbl_yeardiv.yeardivID && year = '".thisyear()."')
left join group_members on contacts.contactID = group_members.contactID
left join groups using (groupID)
WHERE groups.name = 'Students'
and group_members.status like '%Matriculated%'
group by contacts.contactID
Спасибо всем за помощь, всем. Я надеюсь, что то, что я нашел, поможет вам легче писать запросы.