【问题标题】:Sort table, using loop in MySQL with SELECT and UPDATE排序表,在 MySQL 中使用带有 SELECT 和 UPDATE 的循环
【发布时间】:2012-02-26 22:29:25
【问题描述】:

请帮助我在 MySQL 中对表进行排序。我只需要制作一次,而不是用于脚本或其他动态的地方。

这是我的表格“页面”:

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

我需要使用规则更新表:选择具有相同parent_id 的所有行,按title DESC 对它们进行排序并设置第一行position = 0,第二个= 1 等。然后为所有@ 循环987654325@.

我进行了查询以显示我需要的内容,但没有更新,仅针对一个 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;

感谢您的帮助!

【问题讨论】:

    标签: mysql sorting select loops


    【解决方案1】:

    如果您想要一个纯 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;
    

    显然我对你的逻辑做了很多假设,但希望这会让你的思维过程向前发展。

    【讨论】:

      【解决方案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) 对不是唯一的,请使用您的主键作为连接条件 - 您需要将其添加到括号中选择。

      【讨论】:

      • piotrm,你能帮忙升级这个代码HERE吗?谢谢!
      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      相关资源
      最近更新 更多