2012-01-05 1 views
4

Предположим, у меня есть запрос, как это:Как включить записи, в которых отсутствует одна половина соединения?

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    staff s, 
    units u, 
    staff_units r 
WHERE 
    s.staffID = r.staffID 
    AND u.unitID = r.unitID 
GROUP BY s.staffID 
ORDER BY lname 

Это получает список что-то вроде этого:

Alice Accounting 
Bob  Systems 
Charlie Customer Services, Administration 

Хорошо до сих пор. Теперь предположим, что я удаляю запись в staff_units, которая записывает Алису в качестве члена бухгалтерского учета. Выполнение этого запроса будет давать список, из которого Алиса исключается, хотя она до сих пор существует в staff таблице:

Bob  Systems 
Charlie Customer Services, Administration 

Могу ли я настроить этот SQL, так что он продолжает возвращать Алису в результате, показывая ей, как Unassigned к единице?

Я мог бы, конечно, запустить один запрос, чтобы получить список сотрудников, а другой запрос для каждого из них получить текущие назначения. Но это будет означать запуск n + 1 запросов для создания списка, где n - количество сотрудников, и это просто портит меня неправильно.

ответ

6

Вы бы использовать LEFT JOIN

Применительно к выписке, это стало бы

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    staff s 
    LEFT OUTER JOIN staff_units r ON s.staffID = r.staffID  
    LEFT OUTER JOIN units u ON u.unitID = r.unitID 
GROUP BY s.staffID 
ORDER BY lname 

Обратите внимание, что implicit type of join вы используете становится устаревшим.

+0

Отлично, что сделал трюк. Благодарю. Я соглашусь через несколько минут, когда закончится кулдаун. –

+2

@WillMartin - Спасибо, но серьезно относитесь к сведению. Когда вы научитесь использовать явный синтаксис соединения, вам будет намного легче читать и поддерживать. –

+0

Спасибо, я потрачу немного времени на это. –

1

Использование LEFT OUTER JOIN. http://dev.mysql.com/doc/refman/5.0/en/join.html

Таким образом, ваш запрос будет

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    {staff s LEFT OUTER JOIN staff_units r ON s.staffID=r.staffID} 
Смежные вопросы