Сортировка таблицы, используя цикл в MySQL с SELECT и UPDATE - PullRequest
0 голосов
/ 04 февраля 2012

Пожалуйста, помогите мне отсортировать мою таблицу в MySQL.Мне нужно сделать это только один раз, не для использования в скриптах или где-то еще динамически.

Вот моя таблица 'page':

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

Мне нужно обновить таблицу с помощью правила: selectвсе строки с одинаковым 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;

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012
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) не уникальны, используйте ваш первичный ключ в качестве условия соединения - вам нужно будет добавить его, чтобы выбрать в скобках.

0 голосов
/ 05 февраля 2012

Если вы хотите чистый цикл MySQL, вам придется создать хранимую процедуру для выполнения вашего цикла. Вы должны прочитать о MySQL курсорах и затем реализовать что-то вроде этого:

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;

Очевидно, я делаю много предположений о вашей логике, но, надеюсь, это заставит ваш мыслительный процесс двигаться вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...