2014-03-13 48 views
0

我有一个Web程序(PHP和JavaScript),需要根据表单中的条目添加最近的次数来显示条目。为了达到这个目的,我希望表中的一列表示条目号,而另一列表示它应该显示的内容。创建一个SQL表的列来根据它们的顺序编号记录

举例来说,如果我有10条记录,ID=10将对应于Display=1。我想知道是否有一个简单的方法来更新这个,按照entry ID的顺序排列并相应生成display ID

回答

1

为什么不使用SQLServer的默认列值?看看这里看一个例子:Add default value of datetime field in SQL Server to a timestamp

例如,你有一个像这样的表:

create table test (
    entry_id number, 
    message varchar(100), 
    created_time datetime default GETDATE() 
); 

然后你就可以将喜欢

insert into test values (1, "test1"); 
insert into test values (2, "test2"); 

而选择像

select entry_id, message from test order by created_time desc 
+0

这可能替代“ENTRYID”的工作,但我必须感的新条目静态相对值是“1”,将我们总是代表最新的条目,“2”将成为第二个最新的,等等。 – user3415863

+0

我不太明白你为什么需要这样做。不能通过ORDER BY实现你想要的?说实话,仅仅因为添加了一条新记录而更新所有记录并没有意义。 – Tobi

1

你的问题有点模糊,但这里有...

通常标识上升,最高ID是最近添加的,所以你可以ORDER by ID desc在你的查询来确定应显示。您从查询中获得的结果将是显示顺序。

0

有很多方法可以做到这一点。正如其他人所指出的那样,通常的做法是像这样存储反向或反向的ID。你可以通过几种方式获得display_id。这些想到很快:

CREATE TABLE test (entry_id INT) 
GO 
INSERT INTO test VALUES (1),(2),(3) 
GO 

--if you trust your entry_id is truly sequential 1 to n you can reverse it for the display_id using a subquery 
SELECT entry_id, 
     (SELECT MAX(entry_id) + 1 FROM test) - entry_id display_id 
FROM test 

--or a cte 
;WITH cte AS (SELECT MAX(entry_id) + 1 max_id FROM test) 
SELECT entry_id, 
     max_id - entry_id display_id  
    FROM test 
     CROSS APPLY 
     cte 

--more generally you can generate a row easily since sql server 2005 
SELECT entry_id 
     ,ROW_NUMBER() OVER (ORDER BY entry_id DESC) display_id 
    FROM test 

您可以使用视图中的任何方法添加显示ID。通常我建议你只是让表示层处理显示的编号,但是如果你打算反向查询它,你可能想要坚持它。如果相对于读取的写入不频繁,我只能看到存储它。您可以使用触发器更新“真实”列。您也可以创建一个持久计算列。

相关问题