【问题标题】:How to sort a table by column inside of a database?如何在数据库中按列对表进行排序?
【发布时间】: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”子句来精确地对查询结果进行排序
  • @MarkBaker What quick research 表明它们可能被订购但既不是 table 也不是 fetch guarantee 订单(除非你使用ORDER BY)
  • 数据实际上存储在磁盘上的块中......并且许多数据库通常会使用包含足够空间来保存正在存储的数据的第一个可用块(或者可能跨越多个块以获得更大的数据量)....在存储数据时以特定顺序存储数据将是额外的开销,可能会打乱磁盘上的所有后续数据,这与PHP在使用效率非常低的array_shift()或array_unshift()时打乱数组的方式大致相同
  • “id 可以保持不变” - 这对我来说毫无意义。如果你稍后插入一些东西怎么办?假设它被插入到 id1 和 id2 之间,现在新项目将是 id2 而旧 id2 是 id3 - 首先是失败的 ids

标签: php sql pdo sqlite


【解决方案1】:

你可以这样做:

<?php
$db->query("CREATE TABLE DogsSortedByAge LIKE Dogs");
$db->query("INSERT INTO DogsSortedByAge SELECT * FROM Dogs ORDER BY Age DESC");

但是你不能保证数据会以这种方式在磁盘上排序......

想不出您所要求的有效用例...

【讨论】:

  • 在得到合适的响应后,我期望对除基于它的 ID 行之外的所有行进行排序,然后我将能够通过数字 ID,按有序年龄引用列,这就是使用我正在考虑的情况,因为我只会按有序年龄访问表,但我永远不会真正使用年龄列,而是使用 ID 列。我将重新陈述我的问题以说明这一点。
  • 如果目标列是除 ID 列之外的所有列,您能找到一种不涉及创建新表的更好方法吗?谢谢。
  • 感谢您的帮助。不幸的是,这对我没有进一步的帮助,因为为了我的精神健全,我将离开这个 PDO/SQL 废话。我受够了。上周我测试了如果我的 CMS 使用适当的数据库而不是带有 php 数组和其他东西的平面文件,它将如何工作。据说知识渊博的人告诉我尝试一下。他们说,数据库具有更好的性能,并且操作起来非常容易和灵活。我的代码现在比等效的平面文件/数组代码大得多,因为我必须不断寻找技巧来做对数组和平面文件来说微不足道的事情,这很荒谬。 //End_rant
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2017-04-19
  • 2012-08-31
  • 2020-06-14
  • 2022-12-18
  • 2019-01-17
相关资源
最近更新 更多