Следующий запрос возвращает одну строку по желанию. Таблица «контракты» имеет 6 полей, каждое из которых содержит свое имя пользователя, для которого я хочу получить имена / фамилии из отдельной таблицы «пользователи». Это отлично работает, но есть что-то более краткое? Я думаю, что решение должно быть чем-то, использующим GROUP BY contract.id, чтобы держать его в одном ряду, но я не могу найти ничего лучше, чем этот набор суб-выбора.
Помощь!
SELECT contracts.field1, contracts.field2,
(SELECT first_name FROM users WHERE username = service_provider_1),
(SELECT last_name FROM users WHERE username = service_provider_1),
(SELECT first_name FROM users WHERE username = service_provider_2),
(SELECT last_name FROM users WHERE username = service_provider_2),
(SELECT first_name FROM users WHERE username = service_org_business_contact),
(SELECT last_name FROM users WHERE username = service_org_business_contact),
(SELECT first_name FROM users WHERE username = client_service_contact_1),
(SELECT last_name FROM users WHERE username = client_service_contact_1),
(SELECT first_name FROM users WHERE username = client_service_contact_2),
(SELECT last_name FROM users WHERE username = client_service_contact_2),
(SELECT first_name FROM users WHERE username = client_business_contact),
(SELECT last_name FROM users WHERE username = client_business_contact)
FROM contracts
WHERE id = ?
Не было бы так плохо, если бы я мог получить оба имя / фамилию из одного под-выбора ... так что даже с грубым решением о под-выборе у меня вдвое больше деталей думаю, мне нужно ...
РЕДАКТИРОВАТЬ: я понимаю сейчас. Ответом на возможность присоединиться к одной и той же таблице несколько раз является использование псевдонима для таблицы. Спасибо, ребята! Новый код:
SELECT contracts.field1, contracts.field2,
sp1.first_name, sp1.last_name,
sp2.first_name, sp2.last_name,
sobc.first_name, sobc.last_name,
csc1.first_name, csc1.last_name,
csc2.first_name, csc2.last_name,
cbc.first_name, cbc.last_name
FROM contracts
JOIN users AS sp1 ON service_provider_1 = sp1.username
JOIN users AS sp2 ON service_provider_2 = sp2.username
JOIN users AS sobc ON service_org_business_contact = sobc.username
JOIN users AS csc1 ON client_service_contact_1 = csc1.username
JOIN users AS csc2 ON client_service_contact_2 = csc2.username
JOIN users AS cbc ON client_business_contact = cbc.username
WHERE contracts.id = ?
К сожалению, использование объединений почти столь же многословно, как и использование подвыборов, но я предполагаю, что это может быть быстрее?