首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对枚举的排序实际上是如何工作的?

对枚举的排序实际上是如何工作的?
EN

Stack Overflow用户
提问于 2015-04-14 14:20:34
回答 2查看 198关注 0票数 2

在MySQL命令行客户端中运行以下查询时,我遇到了一些奇怪的行为:

代码语言:javascript
复制
SELECT favoriteGenre, firstName, lastName 
FROM members 
ORDER BY favoriteGenre, firstName;

我得到以下结果:

代码语言:javascript
复制
favoriteGenre       firstName       lastName
crime               Jane            Field
crime               John            Sparks
horror              Marty           Pareene
thriller            Mary            Newton
romance             Jo              Scrivener
sciFi               Nick            Blakeley
nonFiction          Bill            Swan

然而,我期待着这些结果:

代码语言:javascript
复制
favoriteGenre       firstName       lastName
crime               Jane            Field
crime               John            Sparks
horror              Marty           Pareene
nonFiction          Bill            Swan
romance             Jo              Scrivener
sciFi               Nick            Blakeley
thriller            Mary            Newton

请注意,nonFiction位于第7位,而我预计它将是第4位.

这是用于创建表的SQL:

代码语言:javascript
复制
USE mydatabase;

CREATE TABLE members (
  id              SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  username        VARCHAR(30) BINARY NOT NULL UNIQUE,
  password        CHAR(41) NOT NULL,
  firstName       VARCHAR(30) NOT NULL,
  lastName        VARCHAR(30) NOT NULL,
  joinDate        DATE NOT NULL,
  gender          ENUM( 'm', 'f' ) NOT NULL,
  favoriteGenre   ENUM( 'crime', 'horror', 'thriller', 'romance', 'sciFi', 'adventure', 'nonFiction' ) NOT NULL,
  emailAddress    VARCHAR(50) NOT NULL UNIQUE,
  otherInterests  TEXT NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO members VALUES( 1, 'sparky', password('mypass'), 'John', 'Sparks', '2007-11-13', 'm', 'crime', 'jsparks@example.com', 'Football, fishing and gardening' );
INSERT INTO members VALUES( 2, 'mary', password('mypass'), 'Mary', 'Newton', '2007-02-06', 'f', 'thriller', 'mary@example.com', 'Writing, hunting and travel' );
INSERT INTO members VALUES( 3, 'jojo', password('mypass'), 'Jo', 'Scrivener', '2006-09-03', 'f', 'romance', 'jscrivener@example.com', 'Genealogy, writing, painting' );
INSERT INTO members VALUES( 4, 'marty', password('mypass'), 'Marty', 'Pareene', '2007-01-07', 'm', 'horror', 'marty@example.com', 'Guitar playing, rock music, clubbing' );
INSERT INTO members VALUES( 5, 'nickb', password('mypass'), 'Nick', 'Blakeley', '2007-08-19', 'm', 'sciFi', 'nick@example.com', 'Watching movies, cooking, socializing' );
INSERT INTO members VALUES( 6, 'bigbill', password('mypass'), 'Bill', 'Swan', '2007-06-11', 'm', 'nonFiction', 'billswan@example.com', 'Tennis, judo, music' );
INSERT INTO members VALUES( 7, 'janefield', password('mypass'), 'Jane', 'Field', '2006-03-03', 'f', 'crime', 'janefield@example.com', 'Thai cookery, gardening, traveling' );

幕后到底是怎么回事,是怎么做的呢?这种行为是MySQL特有的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-14 14:33:54

favoriteGenre是一个enum,而不是我们大多数人期望看到的文本字段。

正如您可以在文档中阅读的那样,enum的排序是根据它们的索引,而不是它们的文本表示。这使您的查询结果正确。

要根据enum的值对其进行排序,您需要使用CAST(col AS CHAR) (感谢McAdam331添加了这一项,也请参阅他的SQLFiddle)。不过,我建议您对数据库进行适当的规范化。

票数 4
EN

Stack Overflow用户

发布于 2015-04-14 14:23:31

它将首先按照第一列对结果进行排序,如果在一种类型中有多个结果,那么在您的情况下,这就是犯罪;它将根据第二列的定义进行排序。

因此,首先它将对favoriteGenre进行排序,然后按名称排序

你的情况--它是enum,所以它改变了整个游戏。它只会对它的索引进行排序。所以你会有这么奇怪的行为。

希望它能解释

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29629850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档