Excluir linhas desnecessárias de uma mesa com 2 critérios
-
25-09-2019 - |
Pergunta
Eu tenho uma tabela de relações com muitos para muitos e preciso excluir as linhas desnecessárias. o lastviews
A estrutura da tabela é:
| user (int) | document (int) | time (datetime) |
Esta tabela registra os últimos usuários que visualizaram o documento. (Usuário, documento) é exclusivo. Eu mostro apenas o Últimos 10 visualizações de um documento E até agora eu excluí o desnecessário assim:
DELETE FROM `lastviews` WHERE `document` = ? AND `user` NOT IN (SELECT * FROM (SELECT `user` FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10) AS TAB)
No entanto, agora eu também preciso mostrar o Últimos 5 Documentos a do utilizador viu. Isso significa que não posso mais excluir linhas usando a consulta anterior, pois ela pode excluir informações de que preciso (digamos que um usuário não visualizasse documentos em 5 minutos e as linhas são excluídas)
Para resumir, preciso excluir todos os registros que não estão nos resultados dessas 2 consultas:
SELECT ... FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10
e
SELECT * FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5
Eu preciso da lógica.
Solução 2
Estou fechando esta pergunta. Não encontrei a resposta que estava procurando, mas acabei fazendo de outra maneira. Decidi remover esses registros com 2 dias de idade para que não haja linhas não utilizadas no banco de dados.
Outras dicas
Uma ou em sua consulta pode resolver seu problema?
algo assim:
DELETE FROM `lastviews` WHERE `document` = ? AND (`user` NOT IN (SELECT * FROM (SELECT `user` FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10) AS TAB) OR 'user' NOT IN (SELECT * FROM (SELECT 'user' FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5) AS TAB))
Portanto, deve excluir apenas os registros que não estão contidos nas duas selecionadas que você precisa