【问题标题】:Creating a column of an SQL table to number records based on their order创建 SQL 表的列以根据记录的顺序对记录进行编号
【发布时间】:2014-04-18 09:32:36
【问题描述】:

我有一个 Web 程序(PHP 和 JavaScript),它需要根据最近添加的条目在表中显示条目。为了做到这一点,我想让表格的一列代表条目号,而另一列代表它应该显示的内容。

例如,如果我有 10 条记录,ID=10 将对应于 Display=1。我想知道是否有一种简单的方法来更新它,按entry ID 排序并相应地生成display IDs。

【问题讨论】:

    标签: sql sql-server database sorting


    【解决方案1】:

    有很多方法可以做到这一点。正如其他人所指出的那样,像这样存储反向或倒置的 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。通常,我建议您让表示层处理显示编号,但如果您打算对其进行查询,则可能需要保留它。如果写入相对于读取不频繁,我只能看到存储它。您可以使用触发器更新“真实”列。您还可以创建一个持久计算列。

    【讨论】:

      【解决方案2】:

      为什么不使用 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
      

      【讨论】:

      • 这可以代替“entryID”,但我需要为新条目提供静态相对值,因为“1”将始终代表最新条目,“2”将成为第二个最新的,等等。
      • 我真的不明白你为什么需要这样做。 ORDER BY 不能达到你想要的吗?老实说,仅仅因为添加了一条新记录就更新所有记录并没有什么意义。
      【解决方案3】:

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

      通常 ID 会上升,最高的 ID 是最近添加的,因此您可以在查询中ORDER by ID desc 来确定应该显示哪个。您从查询中得到的结果将是显示顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        相关资源
        最近更新 更多