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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top