No funciona como crees que debería y la documentación explica el significado de DISTINCT
:se trata de filas distintas :
(fuente:http://dev.mysql.com /doc/refman/5.7/en/select.html )
Debe agrupar las filas por usuario para obtener una sola fila para cada usuario pero, desafortunadamente, no puede obtener su puntaje más reciente de esta manera. Puede obtener el puntaje máximo, mínimo, promedio y otros valores calculados. Consulte la lista de GROUP BY
funciones agregadas
.
La consulta
Esta es la consulta que obtiene los valores que necesita:
SELECT u.fsname, u.emailaddress, la.score
FROM users u
INNER JOIN attempts la # 'la' from 'last attempt'
ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr # 'mr' from 'more recent' (than last attempt)
ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL
Cómo funciona
Se une a la tabla users
(alias como u
) con la tabla attempts
(alias la
, abreviatura de "último intento") usando emailaddress
como la columna correspondiente. Es la combinación que ya tienes en tu consulta, agregué los alias porque te ayudan a escribir menos a partir de ese momento.
A continuación, se une a los attempts
mesa de nuevo (alias como mr
de "más reciente que el último intento"). Coincide con cada intento de la
con todos los intentos de mr
del mismo usuario (identificado por su emailaddress
) y que tienen un datetime
más reciente . El LEFT JOIN
asegura que cada fila de la
coincide con al menos una fila de mr
. Las filas de la
que no tienen una coincidencia en mr
son las filas que tienen los valores más grandes de datetime
para cada emailaddress
. Se combinan con filas llenas de NULL
(para el mr
parte).
Finalmente, el WHERE
cláusula mantiene sólo las filas que tienen NULL
en el datetime
columna de la fila seleccionada de mr
. Estas son las filas que coincidieron con las entradas más recientes de la
para cada valor de emailaddress
.
Comentarios de rendimiento
Para ejecutar rápidamente esta consulta (¡cualquier consulta! ) necesita índices en las columnas utilizadas en JOIN
, WHERE
, GROUP BY
y ORDER BY
cláusulas.
No debe usar emailaddress
en la tabla attempts
para identificar al usuario. Deberías tener un PK
(clave principal) en la tabla users
y usa eso como un FK
(clave externa) en la tabla attempts
(y otras tablas que se refieren a un usuario). Si emailaddress
es el PK
de tabla users
cámbielo a un UNIQUE INDEX
y use un nuevo INTEGER AUTO INCREMENT
ed columna userId
como PK
en cambio. Los índices de las columnas numéricas son más rápidos y ocupan menos espacio que los índices de las columnas de cadenas.