Eu tenho 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
Quero listar todas as empresas e mostrar o usuário e o status de onde eles fizeram uma ação pela última vez. Ao mesmo tempo, mostre às empresas onde nenhuma ação foi realizada.
Problema 2
Também preciso procurar o usuário pelo nome, selecionando todas as empresas em que esse usuário teve a última atividade. A consulta é feita a partir de um formulário, para que eu possa injetar variáveis.
Não estou conseguindo alterar o SCHEMA do banco de dados no momento, mas os conselhos para uma migração futura são muito apreciados.
Eu tentei vinculá-lo, INNER JOIN ( SELECT.. ) t ON
mas não consigo entender.
Eu também tentei métodos daqui , aqui e aqui, mas não consigo acertar a pessoa com as atividades mais recentes.
Versão do MySQL: 5.5.16. A tabela da empresa possui cerca de 1 milhão de linhas e a tabela de ações está em 70K, crescendo. O desempenho é importante para mim aqui.
como isso pode ser resolvido?
MAX(Marks)
porTaskID
, você desejaMAX(ActivityDate)
porCompany
.) Não há muita diferença se você tiver uma tabela ou uma junção.Respostas:
Sua consulta pode ser simplificada para:
Um índice
(deleted, company_id, rtime)
ativado tornaria a subconsulta da tabela derivada eficiente. Suponho que você já tenha índices nas colunas usadas para as junções e noCompany (name)
.SQL-Fiddle
fonte
Depois de experimentar as diferentes respostas, consegui que funcionasse, mas achei lento na minha configuração.
O ypercube me indicou uma resposta que apontou para outras perguntas semelhantes sobre como o MySQL está agrupando resultados. Isso me levou a esse recurso, onde finalmente entendi o que estava acontecendo.
O resultado é uma consulta como esta:
Aqui está um violino com a consulta de trabalho
fonte
Você precisa mover as tabelas de usuário, ação e status para uma subconsulta, assim:
SQL Fiddle
fonte