2013-11-22 52 views
0

我正在查找一个基于表中行数的数值的表字段,并且还通过ASC中的标题对其进行了编号。PHP MySQL数据库自动增量基于行数

有没有这样的事情?

任何帮助非常Apreciated

UPDATE

其看来,这是一个糟糕的主意......有没有在PHP中的任何方法来计算所有的行,并找到ID的行数,并有所有由ASC订购的行?

+0

设置柱为int自动增量,你需要什么? – Ahmad

+0

但如果我删除一条记录,它不会重新编号一切吗?最有可能是一个缺口,就像我有1,2,3,4,5和我删除3它会导致1,2,4,5,我需要它导致1,2,3,4 –

+0

以及是该列的内容,不会改变,您可以执行插入/更新时运行的触发器来为您更新特定列 – Ahmad

回答

0

为响应OP对一些通用的解决方案的请求......

考虑以下...

SELECT recipe FROM recipes ORDER BY recipe; 
+---------------------------------+ 
| recipe       | 
+---------------------------------+ 
| Beans & Macaroni    | 
| Beans on Jacket Potato   | 
| Beans on Toast     | 
| Cheese & Beans on Jacket Potato | 
| Cheese & Beans on Toast   | 
| Cheese on Toast     | 
| Macaroni & Cheese    | 
| Peanut Butter on Toast   | 
| Toast & Jam      | 
+---------------------------------+ 

MySQL Method 1. 
SET @i = 0; 

SELECT @i:[email protected]+1 rank, recipe FROM recipes ORDER BY recipe; 
+------+---------------------------------+ 
| rank | recipe       | 
+------+---------------------------------+ 
| 1 | Beans & Macaroni    | 
| 2 | Beans on Jacket Potato   | 
| 3 | Beans on Toast     | 
| 4 | Cheese & Beans on Jacket Potato | 
| 5 | Cheese & Beans on Toast   | 
| 6 | Cheese on Toast     | 
| 7 | Macaroni & Cheese    | 
| 8 | Peanut Butter on Toast   | 
| 9 | Toast & Jam      | 
+------+---------------------------------+ 

MySQL Method 2. 
SELECT COUNT(*) rank, x.recipe FROM recipes x JOIN recipes y ON y.recipe <= x.recipe GROUP BY x.recipe ORDER BY rank; 
+------+---------------------------------+ 
| rank | recipe       | 
+------+---------------------------------+ 
| 1 | Beans & Macaroni    | 
| 2 | Beans on Jacket Potato   | 
| 3 | Beans on Toast     | 
| 4 | Cheese & Beans on Jacket Potato | 
| 5 | Cheese & Beans on Toast   | 
| 6 | Cheese on Toast     | 
| 7 | Macaroni & Cheese    | 
| 8 | Peanut Butter on Toast   | 
| 9 | Toast & Jam      | 
+------+---------------------------------+ 

PHP Method 
<?php 
include('../testi.inc'); 
$query = "SELECT recipe FROM recipes ORDER BY recipe; 
;"; 

$result = mysqli_query($db,$query); 
$x=''; 
while($row = mysqli_fetch_assoc($result)){ 
$x[] = $row['recipe']; 
} 


?> 
<table> 
    <tr> 
     <td> 
     <? 
    for($i=0;$i<count($x);$i++){ 
    $j = $i+1; 
    echo $j."</td><td>".$x[$i]."</td></tr>\n<tr><td>"; 
    } 
    ?> 
    </td></tr> 
</table> 
0

触发,只要您的表行被删除刚刚在所有行增加了自定义行ID重新定购的事件..

+0

触发器已在评论中提及.. – Ahmad

+0

当我发布我的答案,它不在那里..只有前2个评论可用... – user2991491

0

至于其他已经说过,这是错误的做法,但如果你需要重编(它是有效的,例如排序列),这里是查询:

UPDATE 
    tabaleName 
SET 
    fieldName = fieldName - 1 
WHERE 
    fieldName > 5 
ORDER BY 
    fieldName 
ASC 

而且,由于使用的是自动递增,你必须重新设置

ALTER TABLE tableName AUTO_INCREMENT=10000 

但是p租赁,请注意,我只是为了教育目的而发布此信息。这是错误的方法!

+0

呃..什么是正确的方法? –

+0

为什么你想重新编号的行 – Vineet1982

0

你似乎需要的是在查询时按行编号的时间。其他数据库通过像ROWID(oracle)或ROW_NUMBER(T-SQL,MS-SQL-Server)这样的方法来解决这个问题,您可以在这里为当前记录集生成一行列,如下所示:

SELECT column1, column2,ROW_NUMBER()OVER(column3,column4)as rownumber

这将在尊重删除行的同时生成行号。可悲的是,MySQL不支持这样的功能。

您可以使用变量来模拟行为,对于找到的每条记录都会增加。在mysql.number here上使用CROSS JOIN查看可能的解决方案。我对这种解决方案的性能(或解释扩展)感兴趣。

0

您可以通过查看表格来做到这一点。我偶尔需要一个选择查询来产生已经编号的行,并且用变量很容易做到这一点。

事情是这样的:

SELECT @count:[email protected]+1, t.* FROM (SELECT * FROM <your-table>) t, (SELECT @count:=0) z; 
相关问题