2012-02-04 48 views
0

MySQLでテーブルをソートするのを手伝ってください。スクリプトや他の場所で動的に使用するのではなく、一度だけ作成する必要があります。SELECTとUPDATEでMySQLのループを使用してテーブルをソート

は、ここに私のテーブル「ページ」です:

私はルールを使用してテーブルを更新する必要が
| ... | title | ... | parent_id | ... | position | ... | 

:同じparent_idを持つすべての行を選択し、title DESCによってそれらを並べ替えると、最初の行を設定しposition = 0、第二= 1など。そしてこれはすべてparent_idのためにループしてください。

私は必要なものを表示するためにクエリを作成しましたが、更新はなく、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

+0

ブリリアント!ありがとうございました。 – umpirsky

+0

piotrm、このコードのアップグレードをお手伝いしてください[こちら](http://stackoverflow.com/questions/23031633/sort-table-using-loop-in-mysql-with-select-and-update-with-natural-注文)?ありがとうございました! – Nick

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; 

を私はあなたのロジックについての仮定をたくさん作ってるんだが、うまくいけば、これはあなたの思考プロセスを進めてしまいます。

関連する問題