У меня есть две таблицы, одна хранит пользователей, другая - адреса электронной почты пользователей.
userId
, имя пользователя
, и т. Д.
) emailId
, userId
, email
) Я хотел бы сделать запрос, который позволит мне получить последний адрес электронной почты вместе с записью пользователя.
Я в основном ищу запрос, который говорит
FIRST ORDER BY userEmail.emailId DESC
THEN GROUP BY userEmail.userId
Это можно сделать с помощью:
SELECT
users.userId
, users.username
, (
SELECT
userEmail.email
FROM userEmail
WHERE userEmail.userId = users.userId
ORDER BY userEmail.emailId DESC
LIMIT 1
) AS email
FROM users
ORDER BY users.username;
Но это делает подзапрос для каждой строки и очень неэффективно. (В моей программной логике быстрее выполнить 2 отдельных запроса и «объединить» их.)
Интуитивно понятный запрос, который нужно написать для того, что я хочу, был бы таким:
SELECT
users.userId
, users.username
, userEmail.email
FROM users
LEFT JOIN userEmail USING(userId)
GROUP BY users.userId
ORDER BY
userEmail.emailId
, users.username;
Но это не работает так, как мне хотелось бы. ( GROUP BY
выполняется перед сортировкой, поэтому ORDER BY userEmail.emailId
не имеет ничего общего.)
Итак, мой вопрос:
Можно ли написать первый запрос без использования подзапросов?
Я просмотрел и прочитал другие вопросы по stackoverflow, но, похоже, ни один из них не ответил на вопрос об этом шаблоне запроса.