我知道 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查询中执行此操作?
答案 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)
左侧列将返回序列间隙中的第一个可用点,第二个列是该特定间隙中的最高位数。
答案 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 ) `
根据移动方向使用递增或递减