PHP MySQL数据库自动增量基于行数

时间:2013-11-22 10:07:22

标签: php mysql database

我正在寻找一个表字段,该表字段的数值基于表中的行数,并且还按ASC中的标题编号。

有这样的东西吗?

任何帮助大大增加

更新

似乎这是一个坏主意...在PHP中是否有任何方法可以计算所有行并按ID查找行号并让所有行按ASC排序?

5 个答案:

答案 0 :(得分:0)

每当删除表行时触发一个事件,只需通过递增所有行中的自定义行ID来重新排序它。

答案 1 :(得分:0)

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

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

由于你使用的是自动增量,你必须重置它

ALTER TABLE tableName AUTO_INCREMENT=10000

但请注意,我发布这个仅用于教育目的。这是错误的方法!

答案 2 :(得分: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查看可能的解决方案。我对这种解决方案的性能(或EXPLAIN EXTENDED)感兴趣。

答案 3 :(得分:0)

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

这样的事情:

SELECT @count:=@count+1, t.* FROM (SELECT * FROM <your-table>) t, (SELECT @count:=0) z;

答案 4 :(得分: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:=@i+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>