2015-08-27 2 views
0

У меня есть таблица под названием группа (я наполняюсь этими данными в TreeView)Sqlite заказе цифровой startinng колонки по 1 для каждой категории

id type description orden description 
-- ---- ----------- ----- ----------- 
1 1 Aninals  1  Elefant 
2 1 Animals  2  Tiger 
...... 
25 1 Animals  25 Horse 
26 2 Fish  1  Jaws 
27 2 Fish  2  
.... 

Deleting, inserting, i have jumps in the column orden. 
1 1 Aninals  1  Elefant 
2 1 Animals  3  Tiger 
...... 
25 1 Animals  27 Horse 


I need do somehing like this: 

//animals 
Update grupos set orden = (counter ascendent starting by 1) where type = 1 order by orden 
//fish 
Update grupos set orden = (counter ascendent starting by 1) where type = 2 order by orden 
... 

, чтобы получить столбец без номера заказа подскакивает.

Может ли кто-нибудь помочь в этом заявлении sql?

+0

Это, как правило, плохая идея, чтобы изменить идентификаторы. Что у вас против прыжков? –

+0

Я не хочу менять идентификаторы. Порядок столбцов - порядок животных. В древовидной структуре вы можете тянуть вверх или вниз по животным, меняя порядок. – Joy

+0

Извините, я забыл, что 'id' не' orden'. Но зачем вам нужно * переназначить номера заказов? Когда строка перемещается между двумя другими строками, вам все равно нужно перенумеровать ее в свою программу. –

ответ

0

Для каждой записи просто подсчитайте количество записей с тем же или меньшим номером заказа.
(В SQLite заявление UPDATE не является атомарным при чтении из тех же таблиц, так что мы должны построить новые порядковые номера в другой таблице.)

BEGIN; 

CREATE TEMP TABLE NewOrden AS 
SELECT id, 
     (SELECT COUNT(*) 
     FROM grupos AS g2 
     WHERE g2.type = grupos.type 
      AND g2.orden <= grupos.orden 
     ) AS orden 
FROM grupos; 

UPDATE grupos 
SET orden = (SELECT orden 
      FROM NewOrden 
      WHERE id = orden.id); 

DROP TABLE NewOrden; 
COMMIT; 
+0

Большое спасибо. Это то, что мне нужно. – Joy

Смежные вопросы