我有一个Web程序(PHP和JavaScript),需要根据表单中的条目添加最近的次数来显示条目。为了达到这个目的,我希望表中的一列表示条目号,而另一列表示它应该显示的内容。创建一个SQL表的列来根据它们的顺序编号记录
举例来说,如果我有10条记录,ID=10
将对应于Display=1
。我想知道是否有一个简单的方法来更新这个,按照entry ID
的顺序排列并相应生成display ID
。
我有一个Web程序(PHP和JavaScript),需要根据表单中的条目添加最近的次数来显示条目。为了达到这个目的,我希望表中的一列表示条目号,而另一列表示它应该显示的内容。创建一个SQL表的列来根据它们的顺序编号记录
举例来说,如果我有10条记录,ID=10
将对应于Display=1
。我想知道是否有一个简单的方法来更新这个,按照entry ID
的顺序排列并相应生成display ID
。
为什么不使用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
你的问题有点模糊,但这里有...
通常标识上升,最高ID是最近添加的,所以你可以ORDER by ID desc
在你的查询来确定应显示。您从查询中获得的结果将是显示顺序。
有很多方法可以做到这一点。正如其他人所指出的那样,通常的做法是像这样存储反向或反向的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。通常我建议你只是让表示层处理显示的编号,但是如果你打算反向查询它,你可能想要坚持它。如果相对于读取的写入不频繁,我只能看到存储它。您可以使用触发器更新“真实”列。您也可以创建一个持久计算列。
这可能替代“ENTRYID”的工作,但我必须感的新条目静态相对值是“1”,将我们总是代表最新的条目,“2”将成为第二个最新的,等等。 – user3415863
我不太明白你为什么需要这样做。不能通过ORDER BY实现你想要的?说实话,仅仅因为添加了一条新记录而更新所有记录并没有意义。 – Tobi