2010-10-16 40 views
0

這是您的PHP玩雜耍的人的問題。 我想用普通的ol'mysql_ *函數的PHP。根據相應的行更新一個遞增的值

我有以下MySQL表:

+-----+-----------------+ 
| id | thread   | 
+-----+-----------------+ 
| 14 | 01/    | 
| 14 | 02/    | 
| 14 | 03/    | 
| 15 | 01/    | 
| 22 | 01/    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 24 | XXX    | 
| 32 | XXX    | 
| 32 | XXX    | 
+-----+-----------------+ 

的 「XXX」 值是我的決策。我想該表更改(UPDATE)這一個:

+-----+-----------------+ 
| id | thread   | 
+-----+-----------------+ 
| 14 | 01/  <-  | 
| 14 | 02/    | 
| 14 | 03/    | 
| 15 | 01/  <-  | 
| 22 | 01/  <-  | 
| 24 | 01/  <-  | 
| 24 | 02/    | 
| 24 | 03/    | 
| 24 | 04/    | 
| 32 | 01/  <-  | 
| 32 | 02/    | 
+-----+-----------------+ 

在「ID」字段的每一個值(其中「< - 」是,我的決策,也有),「線程「字段值必須重置爲」01 /「並繼續遞增,直到找到新的」id「值。

我試着用COUNT(id)查詢以某種方式增加。我試圖存儲在數組中。我還想到了mysql_data_seek()。唉,我似乎沒有把它關掉。


我得到了「線程」的格式正確,但:

$thread = $i < 10 ? "0$i" : $i; 

所以,如果它比10大,它沒有得到一個前導零。但這只是有趣的一部分。


任何幫助,將不勝感激。

感謝

回答

1
SET @oldid = 0; 
SET @counter = 0; 
UPDATE tablename 
SET thread = CONCAT(
    LPAD(
    CAST(IF(id = @oldid, 
     @counter := @counter + 1,  -- same id, increment 
     @counter := (@oldid := id)/id) -- other id, set to 1 
     AS UNSIGNED), 
    2,'0'),       -- pad with '0' 
    '/')        -- append '/' 
WHERE thread = 'XXX'     -- or enumerate the whole thing if need be 
ORDER BY id, thread; 

哪些可以只被饋送到「純醇」的mysql_query」(3連續:分別喂SET & UPDATE查詢,或者忘掉SET婷什麼,我只是不願意未初始化的變量;)

+0

我會試試這個。似乎太複雜,錯過。 「單獨提供SET和UPDATE查詢」是什麼意思? – nevvermind 2010-10-16 22:48:41

+0

你不能發送它們作爲一個查詢,但作爲3('mysql_query('SET ...'); mysql_query('SET ...'); mysql_query('UPDATE ...');'。它使用用戶定義的變量,主要的複雜性來自於與SQL的對抗:除非它是表達式的一部分,否則不能「設置」變量,因此簡單的'@counter:= 1,@oldid:= id'已經成爲令人費解的表達式具有相同的結果:'@counter:=(@oldid:= id)/ id',這可能會導致一個浮點數,所以我們轉回到整數。 – Wrikken 2010-10-16 23:15:37

+0

不錯。你能解釋或發送一個鏈接多久將忍受MySQL變量@counter:直到查詢結束,php腳本或重置mysql服務器結束?我找不到它。 – 2010-10-17 18:59:46

0

設置主鍵的元組(ID,線程),並設置線程(而不是ID!)爲AUTO_INCREMENT,然後 運行查詢

INSERT INTO mytable (id) VALUES (24),(24),(32),(24),(32),(24) 

線程屬性應該自動設置。如果你堅持「0n /」形式,我建議根據NEW.thread屬性創建thread_string屬性並創建BEFORE UPDATE觸發器。 它工作嗎?

+0

就像人工智能技巧。不過,我需要一種批量修改該表的方法。實際上,我有2300行。 – nevvermind 2010-10-16 22:45:24

+0

2300條記錄沒有問題。我將按照上面的建議創建另一個空主表(new_table),然後運行「INSERT INTO new_table(id)SELECT id FROM old_table」 - 然後就完成了。祝你好運:-) – 2010-10-17 18:45:24