【发布时间】:2015-04-19 22:02:18
【问题描述】:
我知道可以通过从表中提取数据、对其进行操作并重新插入来实现,我要问的是是否有查询可以做到这一点。
例如,数据库是 db.db,有表 dogs。该表具有列 id,breed,age,name ,其中 id 是主键和自动增量(但是,为了找到一个好的解决方案,可以更改此主键假设)。
我搜索了很多地方,但所有地方都说同样的话,就这样做吧:
$db->query("SELECT breed, age, name FROM Dogs ORDER BY Age DESC");
但是,正如我之前所说,我想对表格进行排序。这种解决方案适用于结果集,而不是表格本身,这就是我提出这个问题的原因。
更新:我很抱歉误导阅读我的问题的人没有正确构建它,我打算根据年龄列对所有列进行排序,但 ID 列可以保持不变,如果这有帮助,这就是我试图通过更改主键假设来表达的意思,但结果是错误的。
UPDATE2 在 stackoverflow 上找到了另一个与此主题完全相关的问题,答案与用户 Quim Calpe 给我的答案类似,即创建另一个表,执行那里的东西,然后将其复制到原始表中,现在问题变成了,是否有更好的方法来执行此操作而不涉及创建另一个表?我想如果表非常大来执行所有这些操作而不是让数据库系统以自己的方式处理它,如果它有一个...
【问题讨论】:
-
所以您想根据
Age?是否有一个原因?通常,在您需要结果之前,您不必担心订单。 -
为什么要对表进行排序,而不是查询结果?数据库不会将数据按排序顺序存储在磁盘上,而是提供 SQL“ORDER BY”子句来精确地对查询结果进行排序
-
数据实际上存储在磁盘上的块中......并且许多数据库通常会使用包含足够空间来保存正在存储的数据的第一个可用块(或者可能跨越多个块以获得更大的数据量)....在存储数据时以特定顺序存储数据将是额外的开销,可能会打乱磁盘上的所有后续数据,这与PHP在使用效率非常低的array_shift()或array_unshift()时打乱数组的方式大致相同
-
“id 可以保持不变” - 这对我来说毫无意义。如果你稍后插入一些东西怎么办?假设它被插入到 id1 和 id2 之间,现在新项目将是 id2 而旧 id2 是 id3 - 首先是失败的 ids