sql >> Base de Datos >  >> RDS >> Mysql

Ejecutar múltiples consultas en MySQL sin usar una subconsulta

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.