Счастливые числа в MySQL - удалить каждую n-ю строку
Я пытаюсь воссоздать счастливые числа до очень большого числа в MySQL для математической задачи.
Правило, по сути, гласит: "посмотрите на n-е число в списке чисел, а затем удалите каждый n-й экземпляр после него".
Простейшим примером является второе число в списке натуральных чисел "2". Таким образом, мы удалили бы 2, затем 4, затем 6, затем 8 и т. Д. Затем вы бы посмотрели на следующее число "3" и удалили 3-е, 6-е, 9-е члены. Интересная часть исходит из того факта, что вы полностью удаляете эти числа из списка чисел, поэтому они сильно отличаются от обычной математики. Следующее число после "3" - это "7", потому что вы уже удалили 4, 5 и 6, поэтому вы смотрите на удаление каждой седьмой записи.
По сути, это всего лишь подсчет, а не математика - что я могу сделать очень хорошо в PHP и MySQL вместе. проблема, с которой я сталкиваюсь, заключается в том, что вы должны получить весь массив из базы данных за один раз, а когда вы достигаете сотен миллионов, обычный компьютер просто не может справиться с памятью. Эта проблема должна решаться исключительно в SQL без передачи данных между программами.
Для получения дополнительной информации о счастливых числах: http://en.wikipedia.org/wiki/Lucky_number объяснил намного лучше, чем я выше.
У меня есть база нечетных целых чисел до 1 000 000 000 (8 ГБ) (то есть уже удаляется каждый второй срок). Я вполне могу получить следующий номер для использования (назовите его x) в PHP:
SELECT * FROM table ORDER BY ID LIMIT n,1
с циклом do-while для подсчета от n = 3 до 1 000 000 000 (в действительности верхний предел n может составить около 150 000 000, так как множество чисел будет удалено), но каждый раз (во время цикла) он должен будет попросить базу данных удалить каждый x номер.
Вот код, который я должен выбрать каждый x-й номер из другого вопроса stackru:
SELECT *
FROM (
SELECT
@row := @row +1 AS rownum, [column name]
FROM (
SELECT @row :=0) r, [table name]
) ranked
WHERE rownum % [x] = 1
Я думаю, мне просто нужно, чтобы это стало утверждением об удалении, но я действительно борюсь с этим. Я программист PHP с только умеренным знанием SQL. Делая это, я буду только передавать инструкции между MySQL и PHP, а не много данных.
Однако, если кто-то захочет пройти всю работу и написать цикл в MySQL (а не просто оператор delete, и я не знаю, возможно ли это вообще!), Я бы с большим удовольствием использовал его.
1 ответ
Вы можете использовать id
из этого запроса, чтобы удалить, используя IN()
состояние
SELECT * FROM [table name]
-- change this to DELETE FROM [table name] when you're confident
WHERE `id` IN (
SELECT `id`
-- * became `id` so that we can use it in IN() above
FROM (
SELECT @row := @row + 1 AS 'rownum', t.`id`
FROM (SELECT @row :=0) r, (SELECT `id` FROM [table name] ORDER BY `id`) t
-- I made it order first because it showed an
-- unexpected ordering for a table I tried this on
) ranked
WHERE `rownum` % [n] = 0
-- and I changed 1 into 0 because that's what we actually need
)
Убедитесь, что оператор select выбирает именно то, что вам нужно, перед удалением. Чтобы проверить, правильно ли вы выбрали записи, попробуйте следующее. Измените 3 на другой номер, который вы хотите использовать. Также не забудьте поменять [table name]
в название вашего стола.
SELECT * FROM (
SELECT @row := @row + 1 AS 'rownum', t.`id`
FROM (SELECT @row :=0) r, (SELECT `id` FROM [table name] ORDER BY `id`) t
) ranked
WHERE `rownum` % 3 = 0