MySQL упорядочение SELECT по связанному столбцу - PullRequest
0 голосов
/ 10 октября 2009

Я бы хотел выбрать Addresses из БД MySQL. Addresses может иметь Contact, Organization или оба. (A Contact может иметь много Addresses. Так же, как и Organization.)

Допустим, я хочу получить все Organization Addresses. Это не страшно. Но что, если я захочу ORDER их Contact.last_name? Некоторые из Addresses не имеют Contact.

Я провел некоторые эксперименты и обнаружил, что если вы ORDER BY contacts.last_name, то будут возвращены только те Addresses, которые имеют Contact. Я попытался ORDER BY contacts.last_name, addresses.street1, но все еще только Addresses, с которым было связано Contact, было возвращено.

Есть ли запрос, который найдет Addresses по Organization.id, упорядочит результаты по Contact.last_name и включит все Organization Addresses, даже те, которые не имеют Contact


Структура стола

addresses
---------
id
contact_id
organization_id
street1

contacts
--------
id
last_name

organizations
-------------
id
name

Решение:

Возвращает все Organization Addresses:

SELECT a.*
FROM addresses a
LEFT JOIN contacts c
ON a.contact_id = c.id
WHERE a.organization_id = '8283'
ORDER BY c.last_name

ОК, отлично, вышеупомянутый запрос решил.

Ответы [ 2 ]

3 голосов
/ 11 октября 2009

Возможно, проблема в соединении, а не в предложении order-by. Как только вы соедините таблицу Addresses с таблицей контактов, условие объединения удалит все кортежи со значениями NULL.

Чтобы избежать этого, вы должны использовать OUTER JOIN вместо INNER JOIN (по умолчанию). Идея, лежащая в основе OUTER JOIN, заключается в простом расширении отсутствующих строк таблицы значениями NULL для обработки / упорядочения и т. Д.

2 голосов
/ 11 октября 2009

Вы можете использовать функцию MySQL IFNULL для возврата пустой строки, когда нет связанного контакта. Таким образом, если для адреса нет связанного контакта, вы все равно получите запись с пустой строкой в ​​столбце контакта, если контакта нет.

Например:

SELECT a.*,
IFNULL(c.last_name, '') AS last_name
FROM Addresses a
LEFT JOIN Contacts c
ON a.contact_id = c.id
ORDER BY IFNULL(c.last_name, '')

Как отмечали другие, ORDER BY не отфильтровывает пропущенные записи. Убедитесь, что у вас есть правильное соединение в вашем запросе, и он будет возвращать записи, даже если нет связанного контакта. Я добавил IFNULL для возврата пустой строки вместо NULL, но это только для эстетики и фактически не меняет количество возвращаемых записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...