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.