Tengo dos tablas, una almacena a los usuarios, la otra almacena las direcciones de correo electrónico de los usuarios.PRIMER PEDIDO POR ... LUEGO GRUPO POR
- tabla de usuarios: (
userId
,username
,etc
) USEREMAIL - tabla: (
emailId
,userId
,email
)
me gustaría hacer una consulta que me permite obtener los últimos correo electrónico dirección junto con el registro del usuario.
Estoy básicamente en busca de una consulta que dice
FIRST ORDER BY userEmail.emailId DESC
THEN GROUP BY userEmail.userId
Esto se puede hacer con:
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;
Pero esto una subconsulta para cada fila y es muy ineficiente. (Es más rápido hacer 2 consultas separadas y 'unirlas' en mi lógica de programa).
La consulta intuitiva para escribir lo que quiero sería:
SELECT
users.userId
, users.username
, userEmail.email
FROM users
LEFT JOIN userEmail USING(userId)
GROUP BY users.userId
ORDER BY
userEmail.emailId
, users.username;
Pero, esto no funciona como se quisiera. (El GROUP BY
se realiza antes de la clasificación, por lo que el ORDER BY userEmail.emailId
no tiene nada que ver).
Así que mi pregunta es:
¿Es posible escribir la primera consulta sin hacer uso de las subconsultas?
He buscado y leí las otras preguntas en stackoverflow, pero ninguna parece responder a la pregunta sobre este patrón de consulta.
¿Puedo pedir lo que su motivación era almacenar el correo a separar? – RobertPitt
¿Está utilizando el último ID de correo electrónico como una indicación de qué dirección de correo electrónico es la dirección de correo electrónico principal del usuario? Eso evitaría que los usuarios seleccionaran una dirección de correo electrónico anterior como principal. ¿Ha considerado simplemente agregar un emailId a la tabla de usuarios? – NamshubWriter
cuando los usuarios cambian su dirección de correo electrónico, se agrega la nueva dirección, las direcciones de correo electrónico anteriores se mantienen durante un año antes de su eliminación (según las especificaciones) – Jacco