php - 创建没有重复行的新表,保留原始顺序

标签 php mysql

MySQL 表只有 5 个字段,但有数百行。有了好的建议(tks Lacoz),我已经复制了该表,同时忽略了重复的行,现在有了一个不包含重复行的新表。

问题:新表以打乱的顺序输入(即观察第一个字段时,称为rel_id)。虽然这在现实世界中并不重要,但此时以相同的顺序排列它们会很有帮助(用于引用过去的笔记等)。

示例行:(请注意,rel_id 是一个自动递增的主键字段)

'rel_id' => 1
'host' => 17
'host_type' => 'client'
'rep' => 7
'rep_type => 'cli_mgr'

以下是用户 Lacoz 帮助我创建新表(不重复)的方法:

mysql_query("create table rels2 like rels");
mysql_query("alter table rels2 add unique index(host,host_type,rep,rep_type)");
mysql_query("insert IGNORE into rels2 select * from rels");

我尝试将“ORDER BY”添加到最终查询中,如下所示:

mysql_query("insert IGNORE into rels2 select * from rels ORDER BY rel_id");

但是并没有解决问题。行仍处于乱序状态。

第一个问题:为什么会发生这种情况?

第二个问题:我如何确保数据以正确的顺序输入?

必要的结果:由于各种原因,我确实需要将数据返回到其以前的外观(但没有重复项)。有人可以建议另一种方法,甚至是 php 脚本来完成此任务吗?

PS:经过几次谷歌搜索后,我认为不可能对表的原始数据进行排序,只能对输出进行排序。正确的? (很难确定什么时候概念和术语都是新手 - 我们都必须从某个地方开始)。

最佳答案

从概念上讲,关系数据库中的数据不以任何特定顺序存储。从数学上来说,它是一个集合或关系,并且集合没有顺序。这就是为什么 SQL 不提供任何按特定顺序插入行的方法(例如,将此行插入到末尾、开头、其他行之后等)。它仅提供一种在给定某些指定排序条件的情况下过滤查询输出的方法。

当然,SQL 的具体实现最终必须以某种顺序将内容存储在磁盘上,这就是为什么当您在没有给出 ORDER BY 子句的情况下查询表时,您会注意到可重复的排序,但你不能指望它。您的软件应该假设行将以任意顺序出现。

如果您需要以特定顺序显示结果,请在查询中使用 ORDER BY。也许构建一个适当的索引(如果还没有)以确保数据库能够以良好的性能生成您请求的排序。

关于php - 创建没有重复行的新表,保留原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13277735/

相关文章:

php - 用户的自定义个人资料字段

php - 将数据库中的值放入 '$string' 中

php - PHP错误处理- “missing argument for errorHandler”

php - 从 MySQL 查询中获取所有行

php - MySQL/PHP - 选择表 1 中的列等于表 2 中的列的所有行并创建 foreach 循环

mysql - 使用 PERL 和 jquery-ajax 检索 mysql 数据

php - Facebook 只返回用户的姓名和 ID

mysql - 自动增量值设置为 ' 18446744073709551615 ',并具有多个加载数据文件

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

MySQL - 多行总数的百分比