Счастливые числа в 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
Другие вопросы по тегам