MySQL:如何获取带行的序列号?

时间:2010-06-30 13:48:58

标签: php sql mysql

如何在最低ID为#1且最高ID为#numberOfResults

的情况下对结果进行编号

示例:如果我的表中只有3行。它的ID是24,87,112,它会像这样拉:

ID  24  87  112
Num 1   2   3

我之所以想要这样,是因为我的经理希望物品的编号类似于item1,item2等。我最初制作它所以它使用了ID,但他看到了像item24,item87,item112。他完全不喜欢它,并希望它们像item1,item2,item3。我个人认为这会导致问题,因为如果你要删除和添加项目,那么item2将不会总是引用相同的东西,并可能导致用户混淆。所以,如果有人有更好的想法,我想听听它。

感谢。

4 个答案:

答案 0 :(得分:11)

我同意关于的评论使用这样的编号方案,如果这些数字将用于除了带数字的项目的简单有序显示之外的任何其他内容。如果这些数字实际上与某些东西联系在一起,那么这是一个非常糟糕的主意!

使用变量,并在SELECT语句中增加它:

SELECT
    id,
    (@row:=@row+1) AS row
FROM table,
(SELECT @row:=0) AS row_count;

示例:

CREATE TABLE `table1` (
    `id` int(11) NOT NULL auto_increment,
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB

INSERT INTO table1 VALUES (24), (87), (112);

SELECT
    id,
    (@row:=@row+1) AS row
FROM table1,
(SELECT @row:=0) AS row_count;

+-----+------+
| id  | row  |
+-----+------+
|  24 |    1 |
|  87 |    2 |
| 112 |    3 |
+-----+------+

工作原理

@row是用户定义的变量。在主SELECT语句运行之前,必须将其设置为零。这可以这样做:

SELECT @row:=0;

或者像这样:

SET @row:=0

但将两个陈述联系起来很方便。这可以通过创建派生表来完成,这就是这里发生的事情:

FROM table,
(SELECT @row:=0) AS row_count;

第二个SELECT实际上先运行。一旦完成,只需要为检索到的每一行递增@row的值:

@row:=@row+1

每次检索行时,@row值都会递增。无论访问行的顺序如何,它始终会生成一个连续的数字列表。所以它对某些东西很方便,对其他东西很危险......

答案 1 :(得分:2)

听起来好像只是在你的代码中创建这个数字而不是试图想出某种使用SQL来做这种错综复杂的方式。循环遍历元素时,只需在那里保持顺序。

答案 2 :(得分:0)

用于什么ID?

如果它仅用于快速简便的参考,那么这很好,但是如果要以任何方式用于删除或管理,那么您唯一的选择就是为每一行分配一个唯一的新ID列。桌子。这样做毫无意义,因为这会重复初始ID列的目的。

答案 3 :(得分:0)

我的公司在CMS系统上遇到了类似的挑战,该系统使用订单字段对网站首页上的文章进行排序。用户想要一个“推广,降级”图标,他们可以点击这些图标来上下移动文章。

同样,不理想,但我们使用的策略是建立一个促销函数和伴随降级函数,通过查询识别当前排序值,分别从上一个或下一个值中加上或减去一个,然后设置值最初提升/降级的项目。设计记录插入以准确设置新添加记录的初始值也是至关重要的,因此插入不会导致添加重复值。出于安全考虑,这也在数据库级别强制执行。用户从未被允许直接键入排序的值,仅通过图标进行升级或降级。说实话,它对用户来说非常有效。

如果你必须走这条路......这不是不可能的。但是有脑损伤......