2013-01-10 48 views
3

我試圖在MySQL中重新創建一個非常大的幸運數字,用於娛樂數學問題。MySQL中的幸運數字 - 刪除每第n行

該規則實質上是'查看數字列表中的第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)的奇數整數數據庫(即每隔第二期就已經刪除)。我可以相當愉快地獲得下使用數量(稱之爲X)在PHP中:用do-while循環,以從n個計數= 3-1,000,000,000(實際上n的上限可能成爲各地

SELECT * FROM table ORDER BY ID LIMIT n,1 

150,000,000的數字被刪除),但每次(在循環中),它都需要詢問數據庫刪除每個第x個數字。

這是我不得不從另一個計算器問題,選擇每個第x號代碼:

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

我想我只需要這成爲一個delete語句,但我真的與掙扎。我是一位只具有中等SQL知識的PHP程序員。通過這樣做,我只會在MySQL和PHP之間傳輸指令,而不是很多數據。

但是,如果有人想要整個豬並在MySQL中編寫循環(不只是刪除語句,我不知道這是甚至可能!),那麼我會很好地利用它。

+0

取其將被刪除了所有的ID,那麼就通過'DELETE FROM table_name的WHERE ID IN($ IDS)'運行它們。 –

回答

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 
+0

非常感謝您花時間回答,當我將其複製到測試文件中時,我得到的行沒有返回%3 = 1,但每行都是%3 = 0,所以我不太確定是什麼正在那裏。當在(對於測試表)中添加delete語句時,我在select語句中得到一個錯誤。 – user1967034

+0

@ user1967034我剛更新了代碼。 – inhan

+0

請使用 - 用於SQL中的評論,而不是#。 :) –