Questions tagged «order-by»

SQL SELECT语句中用于对查询结果进行排序的子句。


7
为什么ORDER BY不属于View?
我了解 您 无法拥有 ORDER BY视野。(至少在我正在使用的SQL Server 2012中) 我也理解排序视图的“正确”方法是通过在查询视图ORDER BY的SELECT语句周围放一个。 但是,对于实际的SQL和视图的用法而言,它相对较新,所以我想了解为什么这是设计使然。如果我正确地遵循了历史记录,这曾经是可能的,并且已从SQL Server 2008中明确删除,依此类推(请不要在确切的版本上引用我的意思)。 但是,我想出Microsoft为什么删除此功能的最佳理由是因为“视图是未排序的数据集合”。 我假设有一个很好的,合理的理由来说明为什么View应该不排序。为什么视图不能只是扁平化的数据收集?为什么特别未排序?似乎很难(至少对我/恕我直言)提出一种具有排序视图的情况。

2
MySQL中的ORDER BY FIELD()如何在内部工作
我了解ORDER BY子句的工作方式以及该FIELD()函数的工作方式。我想了解的是两者如何一起工作进行排序。如何检索行以及如何导出排序顺序 +----+---------+ | id | name | +----+---------+ | 1 | stan | | 2 | kyle | | 3 | kenny | | 4 | cartman | +----+---------+ SELECT * FROM mytable WHERE id IN (3,2,1,4) ORDER BY FIELD(id,3,2,1,4) 上面的查询将导致 +----+---------+ | id | name | +----+---------+ | …
37 mysql  order-by  fields 

2
按列排序应该有索引吗?
我在表中添加了用于搜索结果的索引。我按ASC或DESC顺序显示结果。所以那列应该有索引吗?我在那张桌子上还有2个索引。对该列建立索引或不建立索引会对性能产生怎样的影响?

6
在表中任意排序记录
使用数据库时,通常需要按顺序访问记录。例如,如果我有一个博客,我希望能够以任意顺序重新排列我的博客文章。这些条目通常具有很多关系,因此关系数据库似乎很有意义。 我见过的常见解决方案是添加一个整数列order: CREATE TABLE AS your_table (id, title, sort_order) AS VALUES (0, 'Lorem ipsum', 3), (1, 'Dolor sit', 2), (2, 'Amet, consect', 0), (3, 'Elit fusce', 1); 然后,我们可以对行进行排序,order以使其按正确的顺序排列。 但是,这似乎很笨拙: 如果我想将记录0移到开头,则必须对每个记录重新排序 如果我想在中间插入新记录,则必须对每个记录重新排序 如果要删除记录,则必须对它之后的每个记录重新排序 很容易想到这样的情况: 两个记录具有相同的 order order记录之间存在差距 这些可能很容易发生,原因有很多。 这是Joomla之类的应用程序采用的方法: 您可能会争辩说这里的界面很糟糕,他们应该使用箭头或拖放操作来代替人类直接编辑数字,而您可能是正确的。但是在幕后,发生了同样的事情。 有人建议使用小数来存储顺序,以便您可以使用“ 2.5”将记录插入顺序为2和3的记录之间。虽然这样做有所帮助,但可以说它甚至更麻烦,因为您最终会得到奇怪的小数点(您在哪里停止?2.75?2.875?2.8125?) 有没有更好的方法将订单存储在表中?

6
如何证明数据库中缺少隐式顺序?
最近,我向同事们解释了在必要时使用一列对数据库表中的数据进行排序的重要性,例如,按时间顺序排列的数据。事实证明这有些困难,因为他们似乎可以无休止地重新运行查询,并且总是以相同的顺序返回相同的行集。 我之前已经注意到这一点,而我真正能做的就是坚持要他们信任我,而不仅仅是假设数据库表的行为就像传统的CSV或Excel文件一样。 例如,执行(PostgreSQL)查询 create table mytable ( id INTEGER PRIMARY KEY, data TEXT ); INSERT INTO mytable VALUES (0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'), (7, 'h'), (8, 'i'), (9, 'j'); 将创建具有明确概念顺序的表格。以最简单的方式选择相同的数据将是: SELECT * FROM mytable; 总是给我以下结果: id | data ----+------ 0 | …

3
父子树层次结构订单
我必须遵循SQL Server 2008 R2中的数据。SQLFiddle 架构: 创建表[dbo]。[ICFilters]( [ICFilterID] [int] IDENTITY(1,1)NOT NULL, [ParentID] [int] NOT NULL默认值0, [FilterDesc] [varchar](50)NOT NULL, [Active] [tinyint] NOT NULL默认值1, 约束[PK_ICFilters]主键 ([ICFilterID] ASC)与 PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS =开启 )在[PRIMARY]上 )在[PRIMARY]上 插入[dbo]。[ICFilters](ParentID,FilterDesc,活动) 价值观 (0,“产品类型”,1), (1,'ProdSubType_1',1), (1,'ProdSubType_2',1), (1,'ProdSubType_3',1), (1,'ProdSubType_4',1), (2,'PST_1.1',1), (2,'PST_1.2',1), (2,'PST_1.3',1), …


2
索引是否必须覆盖所有选定的列才能用于ORDER BY?
在SO上,最近有人问为什么不使用ORDER BY? 这种情况涉及MySQL中的一个简单的InnoDB表,该表包含三列和1万行。其中一列(整数)被索引了,OP试图检索按该列排序的整个表: SELECT * FROM person ORDER BY age 他附加了EXPLAIN输出,该输出显示此查询是使用filesort(而不是索引)解决的,并询问为什么会这样。 尽管有提示 FORCE INDEX FOR ORDER BY (age) 导致使用索引的提示,但有人回答(带有支持的注释/来自他人的评论)说,仅当从索引中读取所有选定的列时,索引才用于排序(即通常由Using index该Extra列中的指示)的EXPLAIN输出)。稍后给出了一个解释,即遍历索引然后从表中获取列会导致随机I / O,MySQL认为它比a更昂贵filesort。 这似乎是在关于ORDER BY优化的手册一章中碰到的,它不仅传达出强烈的印象,即ORDER BY从索引满足比执行其他排序更可取(实际上,它filesort是quicksort和mergesort的组合,因此 必须具有下限;虽然应该按顺序遍历索引并查找表,所以这很有意义),但它也忽略了此所谓的“优化”,同时还指出:Ω(nlog n)O(n) 以下查询使用索引来解析ORDER BY零件: SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; 就我的阅读而言,在这种情况下就是这种情况(但没有明确提示就没有使用索引)。 我的问题是: 确实有必要为所有选定的列建立索引以便MySQL选择使用索引吗? 如果是这样,在哪里记录(如果有的话)? 如果没有,这里发生了什么?
15 mysql  index  innodb  order-by 


1
如何以扩展的树状方式对递归查询的结果进行排序?
假设您有一个nodes这样的表: CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); 它代表一个标准的类节点树结构,其中根节点在顶部,几个子节点与根节点或其他子节点悬挂在一起。 让我们插入几个示例值: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); 现在,我要检索前10个根节点及其所有子节点,深度为4: WITH RECURSIVE …

3
视图中ORDER BY子句的替代方案是什么?
这个问题只需要在此站点中即可:) 据我了解,ORDER BY被禁止在视图中使用,因为使用此视图时可能会进行多个排序。 我知道有很多方法可以绕过此限制,例如TOP 99.999999 PERCENT,但是我想知道什么是最佳实践,而不是如何破解它。 因此,如果我想在数据库中创建供个人使用的视图,这意味着我想连接到数据库并仅查看固定和排序的数据,如果无法订购视图,该怎么办? 当前在我的SQL Server数据库中,我有关于该TOPhack的视图,并且我经常使用它们,但是感觉不对。

4
是否真的有可能无法保证针对此特定的冗余派生表的顺序?
在与Lukas Eder的Twitter交谈中,我偶然发现了这个问题。 尽管正确的行为是将ORDER BY子句应用于最外层查询,因为在这里,我们没有在最外层查询中使用DISTINCT,GROUP BY,JOIN或任何其他WHERE子句,因此RDBMS为什么不通过传入的数据是否由内部查询排序? SELECT * FROM ( SELECT * FROM table ORDER BY time DESC ) AS t 至少在PostgreSQL上运行此示例时,对于内部查询和此派生表示例,您将获得相同的执行计划,以及相同的结果集。 因此,我认为规划器将只丢弃最外面的查询,因为它是多余的,或者只是传递内部表的结果。 有人认为情况可能并非如此吗?

2
MySQL连接到另一个表时不使用索引
我有两个表,第一个表包含CMS中的所有文章/博客文章。其中一些文章也可能出现在杂志上,在这种情况下,它们与另一个包含杂志特定信息的表具有外键关系。 这是这两个表的创建表语法的简化版本,其中删除了一些不必要的行: CREATE TABLE `base_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_published` datetime DEFAULT NULL, `title` varchar(255) NOT NULL, `description` text, `content` longtext, `is_published` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `base_article_date_published` (`date_published`), KEY `base_article_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `mag_article` ( `basearticle_ptr_id` int(11) NOT NULL, …

3
NOLOCK提示更改返回记录的顺序
在表Client字段上有一个聚集索引LastName。 当我简单地转储表中的所有记录时,除非按(nolock)提示使用提示,否则它们将按字母顺序显示。该提示会更改记录的顺序。应该是?。我敢肯定,没有其他会话具有对该表所做的更改的开放事务(至少sp_who2没有显示任何内容)。 如何解释顺序上的差异? 从评论中提取的其他信息: 没有命令。非聚集索引是否应强制执行该命令? 即使使用指定聚簇索引的索引提示,查询仍然返回不同的顺序。应该吗 我想知道为什么nolock在不明显更改计划的情况下更改返回记录的顺序。 我对它们做了一个WinDiff-除了(nolock)[查询提示] 之外,其他都一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.