首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按字母顺序排列表中的列数据值

如何按字母顺序排列表中的列数据值
EN

Stack Overflow用户
提问于 2018-09-06 10:44:54
回答 3查看 97关注 0票数 0

我有mysql表,如下所示

代码语言:javascript
复制
id,sort,enabled,font,store
1,1,1,Adlib,0
2,2,1,Arial,0
3,3,1,"Arial Bold",0
4,4,1,"Arial Black",0
----------
----------
40,40,1,Harlow,0
41,41,1,"Hobby Headline",0
42,42,1,"Hobby Horse",0
----------
----------
85,85,1,"Wild West",0
86,86,1,"Zap Chance",0
87,87,1,Helvetica,0

id列是主键。如果我添加了一个新的字体条目,它将存储在表的最后一行中。

如何重新排序字体列值,它们按名称的升序排列?

注意:我不需要select语句,我希望重新排序表本身中的数据。

Update:如果在MySQL中不可能(我只是好奇地想知道),我可以在显示数据时使用替代方法解决问题。谢谢你帮忙。

EN

回答 3

Stack Overflow用户

发布于 2018-09-06 10:48:41

我想重新排序表本身中的数据

表中存在的唯一实际物理顺序是磁盘上的群集主键。这将是id列,而不是字体名称。但是,在任何情况下,通常您都应该在SQL级别进行操作,假设表是按照无序的记录集建模的。

因此,如果希望字体列按特定方式排序,则应使用ORDER BY

代码语言:javascript
复制
SELECT *
FROM yourTable
ORDER BY font;

我应该补充一点,如果您想要一个可以快速按字体名称搜索表的结构,那么您可以在该列上添加一个索引。然后,就会有一个按字体排序的物理结构,但它不是你的实际表格,而是一棵B树。

票数 3
EN

Stack Overflow用户

发布于 2018-09-06 11:03:07

我在MySQL中学到的一件事是,任何没有相对直截了当和有文档可循的方法的东西,都是没有理由的。

在MySQL中没有这样的东西。尽管如此,您可以花费大量资源并强制执行此操作(请记住,它可能会扰乱您的索引,当然也会破坏您的主键,因此您拥有的任何依赖于表的应用程序都会意外地运行),方法是拥有一个进程(存储过程、任何编程语言中的脚本等):

  1. 从表中选择数据并使用order by子句对其进行排序。
  2. 将数据转储到临时表上
  3. 截断原始表
  4. 使用常规insert将临时表转储到最近截断的原始表中。

虽然这样做是可行的,但绝对不可取。而且它又乱又贵。没有真正的理由去做这样的事情。最好对表进行适当的索引,并在查询时进行排序。

票数 1
EN

Stack Overflow用户

发布于 2018-09-06 11:50:10

存储在磁盘上的行的顺序由主键决定,至少对于InnoDB是这样。

InnoDB表将您的数据安排在磁盘上,以便根据主键优化查询。

当您将主键从Id列移动到字体名称列时,行将按字体名称列排序:

代码语言:javascript
复制
CREATE TABLE foobar(Id INT PRIMARY KEY, Name VARCHAR(30));
INSERT INTO foobar(Id, Name) VALUES (1, 'middle');
INSERT INTO foobar(Id, Name) VALUES (3, 'east');
INSERT INTO foobar(Id, Name) VALUES (5, 'west');
INSERT INTO foobar(Id, Name) VALUES (7, 'up');
INSERT INTO foobar(Id, Name) VALUES (2, 'down');
INSERT INTO foobar(Id, Name) VALUES (4, 'left');
INSERT INTO foobar(Id, Name) VALUES (6, 'right');

SELECT * FROM foobar;
+----+--------+
| Id | Name   |
+----+--------+
|  1 | middle |
|  2 | down   |
|  3 | east   |
|  4 | left   |
|  5 | west   |
|  6 | right  |
|  7 | up     |
+----+--------+

ALTER TABLE foobar DROP PRIMARY KEY;
ALTER TABLE foobar ADD PRIMARY KEY(Name);

SELECT * FROM foobar;
+----+--------+
| Id | Name   |
+----+--------+
|  2 | down   |
|  3 | east   |
|  4 | left   |
|  1 | middle |
|  6 | right  |
|  7 | up     |
|  5 | west   |
+----+--------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52202322

复制
相关文章

相似问题

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