MySQL中的幸运数字 - 删除每第n行

时间:2013-01-10 15:03:03

标签: mysql counting

我正在尝试在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 GB)(即每隔一个术语已被删除)。我很乐意在PHP中使用下一个数字(称之为x):

SELECT * FROM table ORDER BY ID LIMIT n,1

使用do-while循环从n = 3-1,000,000,000计数(实际上,当许多数字被删除时,n的上限可能会变为大约150,000,000)但每次(在循环期间)它将需要询问数据库删除每个第x个数字。

这是我必须从另一个stackoverflow问题中选择每个第x个数字的代码:

SELECT * 
FROM ( 
    SELECT 
        @row := @row +1 AS rownum, [column name] 
    FROM ( 
        SELECT @row :=0) r, [table name] 
    ) ranked 
WHERE rownum % [x] = 1 

我想我只需要这个成为删除声明,但我真的很挣扎。我是一名只有中等SQL知识的PHP程序员。通过这样做,我只会在MySQL和PHP之间传输指令而不是大量数据。

然而,如果有人想要整个猪并在MySQL中编写循环(不仅仅是删除语句而且我不知道它是否可能!)那么我会很好地利用它。

1 个答案:

答案 0 :(得分:3)

您可以使用此查询中的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