powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Заполнение пустого поля числами в интервале от 1 до n
14 сообщений из 14, страница 1 из 1
Заполнение пустого поля числами в интервале от 1 до n
    #37904919
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток! Давно уже не программировал, поэтому прошу помочь в решении нубского вопроса =)

У меня в базе есть таблица "brands" , в ней поля "id" (автоинкр. первичный ключ), "name" (char), "ordershow" (int). Все поля заполнены, кроме "ordershow" .

Исходная таблица:

id | name | ordershow
----------------------
1 | BMW |
2 | Opel |
3 | Fiat |

Проблема в следующем: как заполнить пустое поле "ordershow" числами в интервале от 1 до общего кол-ва записей в таблице (к примеру если записей всего три, то от 1 до 3).

Нужен результат в таком виде:

id | name | ordershow
----------------------
1 | BMW | 1
3 | Fiat | 2
2 | Opel | 3

Вот кусочек кода в котором должно это выполниться, но он не правильный, потому что вставляет во все поля конечное число цикла for:
Код: pascal
1.
2.
3.
4.
5.
SQLite_table:=TSQLiteTable.Create(db,'SELECT * FROM brands ORDER BY name ASC');
for start := 1 to SQLite_table.RowCount do begin
SQLite_table:=TSQLiteTable.Create(db,'UPDATE brands SET ordershow ='+inttostr(start));
SQLite_table.Next;
end;



Заранее спасибо за помощь!
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905100
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TSQLiteTable.Create() здесь совершенно не в тему. Не знаю как делают запросы в твоей версии дельфей, но явно не через создание таблиц.

А вообще:
Код: sql
1.
update brands set ordershow = (select count(*) from brands t2 where brands.id <= t2.id)


Читай учебник по SQL. Лучше всего начинать с Основы SQL Мартина Грабера.
http://www.sql.ru/docs/sql/u_sql/
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905136
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, а что такое t2 в твоем запросе?
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905214
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, спасибо, все работает как часы
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905270
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем загвоздка в следующем, все работает, но есть необходимость сначала отсортировать поле name по возрастанию, а затем проставить числа в поле ordershow, буду благодарен за помощь и в этом вопросе)
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905273
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, GenaProgrammist, давно не программировал...
1.
Код: sql
1.
UPDATE brands SET ordershow = <something>


Этот запрос обновляет просто всю таблицу.

2.
Код: pascal
1.
2.
3.
4.
5.
SQLite_table:=TSQLiteTable.Create(db,'SELECT * FROM brands ORDER BY name ASC');  // здесь таблица создается
for start := 1 to SQLite_table.RowCount do begin
SQLite_table:=TSQLiteTable.Create(db,'UPDATE brands SET ordershow ='+inttostr(start)); // а здесь она же пересоздается
SQLite_table.Next;
end;


Как повлияет обновление таблицы на значение SQLite_table.RowCount (верхнего предела цикла) внутри цикла - не берусь судить.
М.б., и никак, а может выдать ошибку (в зависимости от опций компилятора).

3.
Код: pascal
1.
2.
3.
4.
5.
<...>
for start := 1 to SQLite_table.RowCount do begin
  SQLite_table:=TSQLiteTable.Create(db,'UPDATE brands SET ordershow ='+inttostr(start));
  <...>
end;


3.1. Зачем же создавать таблицу там, где нужно всего лишь выполнить запрос?
3.2. Создавать N таблиц (в данном случае - 1 + 3), абсолютно не заботясь об их закрытии / освобождении?

Если хочется непременно через внешнего клиента и в цикле, то, по-моему, нужно использовать
Код: pascal
1.
  sqlite3_exec(FSQLiteDB, PChar(QueryString), nil, nil, ErrMess)


где ErrMess - переменная для возвращаемого сообщения, типа PChar (см.доку и примеры по SQLite3.pas).
И в запросе д.б.указано, что именно обновляем:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
SQLite_table:=TSQLiteTable.Create(db,'SELECT * FROM brands ORDER BY name ASC');
for start := 1 to SQLite_table.RowCount do begin
  //SQLite_table:=TSQLiteTable.Create(db,'UPDATE brands SET ordershow ='+inttostr(start));
  QuerySt := 'UPDATE brands SET ordershow =' + inttostr(start) + ' where id = ' + SQLite_table.FieldByName['id'] + ';';
  if sqlite3_exec(FSQLite, PChar(QuerySt), nil, nil, ErrMess) <> SQLITE_OK 
  then Break; 
  SQLite_table.Next;
end;



Должно сработать.
Но этот колпак - не по-колпаковски...
По уму, надо одним запросом внутри БД это делать.
На этот счет - пусть выскажутся люди, более опытные в SQLite; я в ней - новичок.
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905285
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
  ...
  where brands.name < t2.name and brands.id < t2.id
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905304
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, конечно:
Код: sql
1.
2.
3.
  ...
  where (brands.name < t2.name)
    or ((brands.name = t2.name) and (brands.id < t2.id))
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905336
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"необходимость сначала отсортировать поле name по возрастанию, а затем проставить числа в поле ordershow, буду благодарен за помощь и в этом вопросе)"

Serg_Gap, а с этим не поможете?
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905339
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соротировка и сидит в условии where.
Просто в конечной выборке (после нумерации) - добавить
Код: sql
1.
2.
  select * from brands
  order by ordershow;


Для чего огород-то городили?
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905353
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
  where (brands.name < t2.name)
    or ((brands.name = t2.name) and (brands.id < t2.id))


Это условие - для того запроса, который Вам написал White Owl.
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905378
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg_Gap, спасибо большое, все работает!)
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905385
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlЧитай учебник по SQL.
+
...
Рейтинг: 0 / 0
Заполнение пустого поля числами в интервале от 1 до n
    #37905389
GenaProgrammist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg_Gap, этим как раз и займусь
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Заполнение пустого поля числами в интервале от 1 до n
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]