Tengo esta consulta ( SQLFiddle ):
SELECT
c.name,
a.user_id,
a.status_id,
a.title,
a.rtime,
u.user_name,
s.status_name
FROM company c
LEFT JOIN action a ON a.company_id=c.id
LEFT JOIN user u ON u.id=a.user_id
LEFT JOIN status s ON s.id=a.status_id
WHERE u.user_name='Morgan'
-- WHERE c.name='Fiddle'
GROUP BY c.id
HAVING a.rtime IS NULL OR a.rtime = (
SELECT max(rtime)
FROM action a2
WHERE deleted IS NULL
AND a2.company_id = c.id
)
Problema 1
Quiero enumerar todas las empresas y mostrarle al usuario y el estado en el que realizaron la última acción en la empresa. Al mismo tiempo, muestre a las compañías dónde no se han realizado acciones.
Problema 2
También necesito poder buscar al usuario por nombre, seleccionando así todas las compañías donde este usuario tuvo la última actividad. La consulta se realiza desde un formulario, por lo que puedo inyectar variables.
No puedo cambiar la base de datos SCHEMA en este momento, pero los consejos para una futura migración son muy apreciados.
He intentado unirlo, INNER JOIN ( SELECT.. ) t ON
pero no puedo entenderlo.
También probé métodos de aquí , de aquí y de aquí, pero no puedo entender bien a la persona con la última actividad.
Versión de MySQL: 5.5.16. La mesa de la compañía tiene aproximadamente 1 millón de filas, y la mesa de acción está en 70K, creciendo. El rendimiento es importante para mí aquí.
¿Cómo se puede resolver esto?
MAX(Marks)
porTaskID
, usted quiereMAX(ActivityDate)
porCompany
.) No hay mucha diferencia si tiene una tabla o una combinación.Respuestas:
Su consulta se puede simplificar para:
Un índice
(deleted, company_id, rtime)
activado haría eficiente la subconsulta de la tabla derivada. Supongo que ya tiene índices en las columnas utilizadas para las uniones y en elCompany (name)
.SQL-Fiddle
fuente
Después de probar las diferentes respuestas, lo puse a funcionar, pero lo encontré lento en mi configuración.
ypercube me señaló una respuesta que apuntaba a otras preguntas similares sobre cómo MySQL está agrupando los resultados. Esto me llevó a este recurso donde finalmente entendí lo que estaba pasando.
El resultado es una consulta como esta:
Aquí hay un violín con la consulta de trabajo
fuente
Debe mover las tablas de usuario, acción y estado a una subconsulta, como esta:
Violín de SQL
fuente