ПЕРВЫЙ ORDER BY… THEN GROUP BY

У меня есть две таблицы, одна хранит пользователей, другая - адреса электронной почты пользователей.

  • table users: ( userId , имя пользователя , и т. Д. )
  • таблица userEmail: ( 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, но, похоже, ни один из них не ответил на вопрос об этом шаблоне запроса.

11
задан viraptor 12 September 2010 в 16:07
поделиться