如何使用PHP在MySQL表中找到下一个可用的整数

时间:2013-04-18 21:57:44

标签: php mysql

我知道 auto_increment 是要走的路但我不能使用auto_increment功能,因为我的表中的列可能重复,它不是唯一的。当我向表中插入一个新行时,我需要一种方法来找到插入它的下一个可用点。

例如表格结构:

 Primary Key = (ID, UserID)
 ID   UserID 
 3    6
 3    1
 1    3

现在,当我插入查询时,我希望在 ID = 2 而不是 4 时进行查询。使用 auto_increment ,它会为我提供 4

有没有在PHP中使用循环的解决方案?到目前为止,我所拥有的是将所有行提取到数组中,然后找到ID中的下一个可用数字。是不是可以在PHP中获取所有行而只是在MySQL查询中执行此操作?

4 个答案:

答案 0 :(得分:5)

SELECT t1.id+1 AS MISSING_ID
FROM the_table AS t1
LEFT JOIN the_table AS t2 ON t1.id+1 = t2.id
WHERE t2.id IS NULL
ORDER BY t1.id LIMIT 1;

我做了一个小提琴:http://sqlfiddle.com/#!2/4d14d/2

答案 1 :(得分:3)

不,没有处理数据是不可能的。解决此问题的首选方法是调整表结构以支持唯一的可自动增量字段。如果做不到这一点,您将不得不处理数据(在PHP中或通过SQL语句)来查找打开的插槽。

答案 2 :(得分:0)

这应该可以解决问题:

SELECT
  min_table.ID+1 AS start,
  MIN(max_table.ID) - 1 AS end
FROM
  your_table AS min_table,
  your_table AS max_table
WHERE
  min_table.ID < max_table.ID
GROUP BY
  min_table.ID
HAVING
  start < MIN(max_table.ID)

左侧列将返回序列间隙中的第一个可用点,第二个列是该特定间隙中的最高位数。

来源:http://www.codediesel.com/mysql/sequence-gaps-in-mysql/

答案 3 :(得分:0)

我未加载项目的解决方法:

假设您对question_id的问题设置属于某个topic_id。

假设用户导航并点击"<Prev" "Next>"按钮来导航问题。

您只有当前的ID。抓住导航的方向 topic_id question_id ,您可以进行循环

  do {

  // query base, doing question_id++ or question_id-- depending on needed    direction until you find next id within topic_id 

  } while( id!=null ) `

根据移动方向使用递增或递减