数据库查询的问题

wxq4100798 2007-11-26 02:28:05
数据库里ID 有值 1,2,4,6,10,我怎么得到3,5,7,8,9,有什么好放法 将他补齐

就是说,将数据库ID 补成连续的
变成123456789
设表名为 table ,怎么做
...全文
296 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
SysTem128 2007-11-29
  • 打赏
  • 举报
回复
默认是按照主键自然排序的,而这里主键是id.所以顺序是不会变的.
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
to SysTem128
插入新数据后,虽然ID是一样的,但由于存储位置已改变,所以肯定是乱序
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复

mysql> set @a = 1; select c_f,@a:=@a+1 as tmp_id from (select c_f from c order b
y c_f asc) as c1 where c_f<@a+1 order by tmp_id desc limit 1;//
Query OK, 0 rows affected (0.00 sec)

+-----+--------+
| c_f | tmp_id |
+-----+--------+
| 7 | 8 |
+-----+--------+
1 row in set (0.01 sec)

我晕,这样才行,郁闷
结分了
SysTem128 2007-11-29
  • 打赏
  • 举报
回复
插入时使用的还是原来的编号,怎么会乱序呢?
而且乱了可以排. 你是不是等人把馒头嚼烂了再给你嘴送?
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
汗,你删除一次之后,再插入就已经是乱序了
SysTem128 2007-11-29
  • 打赏
  • 举报
回复
哦~你需要对id字段也进行排序.
看来你不知道这个语句是怎么运作的.
id 字段是自增的 或者说是自然排序的
@kid 也就构造出一个自然数序列,和记录数同步递增.
而你的id字段是混序的,所以会取出不和序列的3.
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
我日了,还不对,郁闷,老大,你们什么版本的MYSQL
mysql> select * from c;
-> //
+-----+
| c_f |
+-----+
| 1 |
| 2 |
| 4 |
| 3 |
| 5 |
| 6 |
| 10 |
| 7 |
| 9 |
+-----+
9 rows in set (0.00 sec)

mysql> set @a = 1; select c_f,@a:=@a+1 as tmp_id from c where c_f<@a+1 order by
tmp_id desc limit 1;
-> //
Query OK, 0 rows affected (0.00 sec)

+-----+--------+
| c_f | tmp_id |
+-----+--------+
| 3 | 4 |
+-----+--------+
1 row in set (0.01 sec)

mysql>
SysTem128 2007-11-29
  • 打赏
  • 举报
回复
Order By kid 谢谢呀~
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
你可以试一下,set @a = 100;
然后再回去SELECT @a看看,绝对是100
而且,我按你的写法,放在一行,结果一样
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
我汗,你没看到我是用//用分隔符,上面的算一句SQL
SysTem128 2007-11-29
  • 打赏
  • 举报
回复

mysql>set @a=1; 你这样执行,请问这条语句有什么用处?你这里点完回车,下面这句和这个就一点关系都没有了.
->select c,@a:=@a+1 from c where c <@a+1 order by c desc limit 1;
->//
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
请看一下,下面的测试有何问题,按SYSTEM128程序,应该得出是8,而事实上,我确实得出的是2,难道是因为MYSQL 版本的问题?
mysql> delimiter //
mysql> select * from c;//
+----+
| c |
+----+
| 1 |
| 2 |
| 4 |
| 3 |
| 5 |
| 6 |
| 10 |
| 7 |
| 9 |
+----+
9 rows in set (0.00 sec)

mysql> set @a = 1;
-> select c,@a:=@a+1 from c where c<@a+1 order by c desc limit 1;
-> //
Query OK, 0 rows affected (0.00 sec)

+---+----------+
| c | @a:=@a+1 |
+---+----------+
| 1 | 2 |
+---+----------+
1 row in set (0.01 sec)

mysql>


dreambird1983 2007-11-29
  • 打赏
  • 举报
回复
因为兴趣关系,SysTem128的语句我也测试过,可用~~~~
SysTem128 2007-11-29
  • 打赏
  • 举报
回复
set @kid=1; select id,body,@kid:=@kid+1 as kid from a where id < @kid+1 order by kid desc limit 1;


这很明显是放在一起的语句,不是两条不相干的语句.@kid需要初始化为1. 这么精良的语句,大量的测试数据,都证明它是正确的.你竟然由于自己的低级错误否定了它,可悲.
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
to ideal_1983
你的想法倒是可行的,如果实在没办法就用你的一试
wxq4100798 2007-11-29
  • 打赏
  • 举报
回复
to SysTem128
mysql> set @a = 1;
-> select c+1,@a:=@a+1 as t from c where c<@a+1 order by c desc limit 1;
-> //
Query OK, 0 rows affected (0.00 sec)

+-----+------+
| c+1 | t |
+-----+------+
| 2 | 2 |
+-----+------+
1 row in set (0.00 sec)

你那个语句不对吧,MYSQL 查出来明显是2,

SysTem128 2007-11-28
  • 打赏
  • 举报
回复
看来你还是没有看回帖.
有语句可以找出已删位置.
fxs_2008 2007-11-28
  • 打赏
  • 举报
回复
偶测试了一下
结果如下:
1、在id 为auto_increment 的情况下,如果id不存在,可以直接插入
2、如果id 已存在,插入出错

可以做个临时表循环插入,在PHP中操作,如果没有出错,说明这个ID是要补的,记入数组。如查出错,继续循环下一个数!

补插时根据数据组中的值直接插入!
我代码功底不好,大侠给写一个吧!




fxs_2008 2007-11-28
  • 打赏
  • 举报
回复
to SysTem128:
接受批评,也期等你的好办法和好思路
foolbirdflyfirst 2007-11-28
  • 打赏
  • 举报
回复
数据库里ID 有值 1,2,4,6,10,我怎么得到3,5,7,8,9,有什么好放法 将他补齐
===================================================================
在插入之前,如何找到3作为插入数据的id,是问题的关键,也就是找到第一个id连续的断开点。
建议:加一字段(breakpoint)保存断点标志,默认为null,做删除操作时自动将上一条记录的breakpoint设为1,则插入的id为breakpoint为1的id再加1,更新breakpoint记录,如何数据量大则加一字段未免浪费,可以考虑用文件记录breakpoint的id.

如何已经设计成型,现在想补全,问题就是每次插入时如何找到第一个id连续的断开点。
加载更多回复(20)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧