Удаление ненужных строк из таблицы с 2 критериями - PullRequest
2 голосов
/ 05 января 2011

У меня есть таблица отношений «многие ко многим», и мне нужно УДАЛИТЬ ненужные строки. Структура таблицы lastviews:

| user (int) | document (int) | time (datetime) |

В этой таблице регистрируются последние пользователи, просмотревшие документ. (пользователь, документ) является уникальным. Я показываю только последние 10 просмотров документа и до сих пор я удалял ненужные, как это:

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)

Однако теперь мне нужно также показать последние 5 документов, которые пользователь просмотрел. Это означает, что я больше не могу удалять строки, используя предыдущий запрос, потому что он может удалить необходимую мне информацию (скажем, пользователь не просматривал документы в течение 5 минут, а строки удаляются)

Подводя итог, мне нужно удалить все записи, которых нет в результатах этих 2 запросов:

SELECT ... FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10

и

SELECT * FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5

Мне нужна логика.

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

Я закрываю этот вопрос.Я не нашел ответ, который искал, но закончил делать это по-другому.Я решил удалить эти записи, которые имеют возраст 2 дня, чтобы в базе не было неиспользуемых строк.

0 голосов
/ 09 января 2011

может ли ИЛИ в вашем запросе решить вашу проблему?

примерно так:

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))

, поэтому он должен удалять только записи, которые не содержатся в двух SELECT, которые вынеобходимо

...