SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.05.2015 14:34:06

olga007
Участник
Зарегистрирован: 21.03.2015
Сообщений: 6

Запрос для заполнения столбца таблицы числами 1..n

Добрый день! Помогите пожалуйста с запросом. Искала ответ, но не нашла, видимо использую неправильную терминологию.
Нужно в одной таблице выбрать все записи по одному полю (parent), и в этих записях в поле sort записать значения от 1 до n (n - количество записей в выборке). Как выбрать записи знаю, как просто присвоить значение тоже знаю. Не получается сделать так, чтобы эти значения возрастали.

Исходная таблица:
id   title                descr                                       parent   sort
1    CISA 56785     замок врезной под тяги...           1             
7    CISA 56786     замок врезной под тяги...           1
3    CISA 57785     замок врезной под тяги...           1
11  CISA 57786     замок врезной под тяги...           1
9    CISA 57985     замок врезной с защелкой...       2

Выходная таблица (запрос только для выборки, где parent=1):
id   title                descr                                       parent   sort
1    CISA 56785     замок врезной под тяги...           1             1
7    CISA 56786     замок врезной под тяги...           1             2
3    CISA 57785     замок врезной под тяги...           1             3
11  CISA 57786     замок врезной под тяги...            1             4
9    CISA 57985     замок врезной с защелкой...       2

Заранее спасибо!

Неактивен

 

#2 15.05.2015 16:27:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос для заполнения столбца таблицы числами 1..n

MariaDB [test]> select * from temp;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 | NULL |
|    1 | 9156 | NULL |
|    1 | 2743 | NULL |
|    1 | 3011 | NULL |
|    7 | 7806 | NULL |
|    8 | 9706 | NULL |
+------+------+------+
6 rows in set (0.00 sec)

MariaDB [test]> update temp, (select @i:=0) x set c = @i:=@i+1 where a=1;
Query OK, 4 rows affected (0.05 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [test]> select * from temp;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 |    1 |
|    1 | 9156 |    2 |
|    1 | 2743 |    3 |
|    1 | 3011 |    4 |
|    7 | 7806 | NULL |
|    8 | 9706 | NULL |
+------+------+------+
6 rows in set (0.00 sec)


 

Неактивен

 

#3 15.05.2015 18:03:21

olga007
Участник
Зарегистрирован: 21.03.2015
Сообщений: 6

Re: Запрос для заполнения столбца таблицы числами 1..n

vasya, большое вам спасибо, все получилось!
По моей вине результат не совсем такой, как хотелось бы - после выборки надо было отсортировать по id, а потом уже присваивать значения в столбце sort.
Подскажите пожалуйста, в какое место в запросе вставить ORDER BY id ASC?

Большое вам спасибо!

Неактивен

 

#4 15.05.2015 18:27:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос для заполнения столбца таблицы числами 1..n

Если я правильно понял, то

update `таблица`, (select @i:=0) x set sort = @i:=@i+1 where parent = 1 order by id;

Неактивен

 

#5 15.05.2015 18:46:57

olga007
Участник
Зарегистрирован: 21.03.2015
Сообщений: 6

Re: Запрос для заполнения столбца таблицы числами 1..n

vasya,
после того, как установили начальное значение переменной i=0, делаем выборку (WHERE parent=32), после этого в пределах выборки нужно отсортировать записи по id по возрастанию. И далее этим записям в поле sort присваиваем значения 1..n.

Пишу запрос:
UPDATE `catalog`, (SELECT @i:=0) x SET sort=@i:=@i+1 WHERE parent=32 ORDER BY id;

SQL ругается:
#1221 - Incorrect usage of UPDATE and ORDER BY

Неактивен

 

#6 15.05.2015 21:18:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос для заполнения столбца таблицы числами 1..n

Точно, order by только однотабличного update, тогда

update temp, (select b, @i:=@i+1 i from temp, (select @i:=0) x where a=1 order by b) t set c=i where temp.b=t.b;

MariaDB [test]> select * from temp;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    1 |    1 |
|    1 | 9156 |    4 |
|    1 | 2743 |    2 |
|    1 | 3011 |    3 |
|    7 | 7806 | NULL |
|    8 | 9706 | NULL |
+------+------+------+
6 rows in set (0.00 sec)
в моем примере поле b это аналог вашего id.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson