请帮我在MySQL中对表格进行排序。我只需要制作一次,而不是动态地在脚本或其他地方使用。
这是我的表'页':
| ... | title | ... | parent_id | ... | position | ... |
我需要使用规则更新表:选择具有相同parent_id
的所有行,按title
DESC排序并设置第一行position
= 0,秒= 1等。并为所有parent_id
循环播放。
我做了一个查询来显示我需要的内容,但没有更新,只有一个parent_id
。但是因为有几千parent_id
这个查询需要一个循环。选择后,必须更新position
以使其与当前行的@number具有相同的值。
SET @number = -1;
SELECT @number:=@number+1 AS number, p.* FROM `page` AS p WHERE parent_id=1
ORDER BY title DESC;
感谢您的帮助!
答案 0 :(得分:2)
SELECT @p:=0, @parent:=0;
UPDATE page p1
JOIN
( SELECT title,
CASE WHEN @parent<>parent_id THEN @p:=0 ELSE @p:=@p+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,title)对不是唯一使用主键作为连接条件 - 您需要将其添加到括号中选择。
答案 1 :(得分: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;
显然我对你的逻辑做了很多假设,但希望这会让你的思维过程继续前进。