2015-08-27 36 views
0

我有一个表称为组(我填这个数据的树视图)sqlite的排序由1数字列startinng为每个类别

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

它通常是一个坏主意,改变ID。你有什么对抗跳跃? –

+0

我不想更改ID的。列顺序是动物的顺序。在树视图中,你可以拖动或拖动动物,我改变顺序。 – 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