我正在尝试在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中编写循环(不仅仅是删除语句而且我不知道它是否可能!)那么我会很好地利用它。
答案 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