【发布时间】:2013-01-10 15:03:03
【问题描述】:
我正在尝试在 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
我想我只需要它成为一个删除语句,但我真的很挣扎。我是一个 PHP 程序员,只有适度的 SQL 知识。通过这样做,我只会在 MySQL 和 PHP 之间传输指令,而不是大量数据。
但是,如果有人想全力以赴并在 MySQL 中编写循环(不仅仅是删除语句,我不知道这是否可能!)那么我会充分利用它。
【问题讨论】:
-
获取所有将被删除的 id,然后通过
DELETE FROM table_name WHERE id IN ($ids)运行它们。