2012-02-04 67 views
0

請幫我在MySQL中排序我的表。我只需要製作一次,而不是在腳本或其他地方動態使用。排序表,在MySQL中使用循環SELECT和UPDATE

這裏是我的表「頁面」:

| ... | title | ... | parent_id | ... | position | ... | 

我需要用規則來更新表:選擇具有相同parent_id所有行,由title DESC對它們進行排序,並設置第一行position = 0,第二= 1等。並循環所有parent_id

我做了一個查詢來顯示我需要什麼,但沒有更新,只有一個parent_id。但是因爲有幾千個這個查詢需要一個循環。選擇後,position必須更新爲與當前行的@number相同的值。

SET @number = -1; 
SELECT @number:[email protected]+1 AS number, p.* FROM `page` AS p WHERE parent_id=1 
    ORDER BY title DESC; 

感謝您的幫助!

回答

2
SELECT @p:=0, @parent:=0; 
UPDATE page p1 
JOIN 
(SELECT title, 
    CASE WHEN @parent<>parent_id THEN @p:=0 ELSE @p:[email protected]+1 END as position, 
    @parent:=parent_id as parent_id 
    FROM page 
    ORDER BY parent_id, title DESC) p2 
ON p1.title = p2.title AND p1.parent_id = p2.parent_id 
SET p1.position = p2.position 

如果你(PARENT_ID,標題)對是不是唯一使用的連接條件的主鍵 - 你將需要添加它在括號中進行選擇。

+0

完美解決!非常感謝! – Nick 2012-02-05 13:38:17

+0

太棒了!節省了我的時間,謝謝。 – umpirsky 2012-10-05 12:25:55

+0

piotrm,你可以請幫助升級此代碼[這裏](http://stackoverflow.com/questions/23031633/sort-table-using-loop-in-mysql-with-select-and-update-with-natural-訂購)?謝謝! – Nick 2014-04-17 13:56:20

0

如果你想要一個純粹的MySQL循環,你必須創建一個存儲過程來完成循環。您應該MySQL cursors閱讀起來,然後實現這樣的事情:

DECLARE current_number INT; 
DECLARE current_parent INT; 
DECLARE current_id INT; 
DECLARE my_cursor CURSOR FOR SELECT p.id FROM `page` AS p WHERE parent_id=current_parent; 
SET current_parent := 1; 
SET current_number := -1; 
OPEN my_cursor; 
read_loop: LOOP 
    SET current_number := current_number + 1; 
    FETCH my_cursor INTO current_id; 
    UPDATE page SET position = current_number WHERE id = current_id; 
    #whatever other logic you have 
    SET current_parent := current_id; 
END LOOP; 
CLOSE my_cursor; 

很顯然,我做很多假設你的邏輯,但希望這將讓你的思維過程向前發展。