如何按字母顺序对表中的列数据值进行重新排序

时间:2018-09-06 10:44:54

标签: mysql

我有如下所示的mysql表

    library(ggplot2)
    k<-18  
    ct<-12 
    x_vector<-seq(1,k,1)
    radius<-rep(5,k,1)
    name<-c('Alice','Bob','Charlie','D','E','F','G','H','I','J','K','L','M','N','O','Peter','Quin','Roger')
    df<-data.frame(x_vector,radius,name)

    name2<-c('Alice2','Bob2','Charlie','D','E','F','G','H','I','J','K','L','M','N','O','Peter2','Quin2','Roger2')
    plotter<-c(1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
    radius2<-rep(7,k,1)
    df2<-data.frame(x_vector,radius2,name2,plotter)

    color1<-c(rep('#F8766D',2), # Alice and Alice2
              rep('#F564E3',2), # Bob and Bob2
              rep('#B79F00',1)  # Charlie
    )
    other_color<-c(rep('#A9A9A9',12))
    color2<-c(rep('#00BFC4',2),
              rep('#619CFF',2),
              rep('#00BA38',2)
    )
    cdf<-c(color1,other_color,color2) #color palette
    df$label_radius<-df$radius+0.5  ##used to adjust the labels by a radius of 0.5
    p<-ggplot()+
      ## Level1
      geom_point(data=df,aes(x=x_vector,y=radius,color=name,fill=name),size=3,shape=21)+
      scale_color_manual(values=cdf)+
      scale_fill_manual(values=cdf)+
      geom_text(data=df,aes(x=x_vector,y=label_radius,label=name,color=name))+

      ## Level2
      geom_point(data=df2[(df2$plotter>0),], aes(x=x_vector,y=radius2,color=name2,fill=name2),size=3,shape=21)+
      geom_text(data=df2[(df2$plotter>0),], aes(x=x_vector,y=radius2,label=name2,color=name2))+

      ## transform into polar coordinates
       coord_polar(theta='x',start=0,direction=-1)+ #,clip='on')+ # <-- the clip property does not work for me, probably due to my ggplot version 

      ## sets up the scale to display from 0 to 7
      scale_y_continuous(limits=c(0,7))+

      ## Used to 'push' the points so all 'k' show up.
      expand_limits(x=0)
    p

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

如何按其名称的升序对字体列值进行重新排序?

注意:我不想选择语句,我想对表本身中的数据重新排序。

更新:如果在MySQL中是不可能的(我只是想知道),则可以在显示数据时使用其他方法解决我的问题。感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

  

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

表中唯一存在的实际物理顺序是磁盘上群集的主键。这将是id列,而不是字体名称。但是,无论如何,总的来说,您应该在SQL级别进行,前提是假设表是按照无序记录集建模的。

因此,如果要按某种方式对字体列进行排序,则应使用ORDER BY

SELECT *
FROM yourTable
ORDER BY font;

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

答案 1 :(得分:1)

我从MySQL中学到的一件事是,任何没有相对简单明了的文档来完成的事情,由于某种原因都没有

MySQL中没有这样的东西。就是说,您可能会花费大量资源并强制执行此操作(请记住,它可能会与您的索引以及绝对与您的主键混为一谈,因此无论您拥有的依赖于表的任何应用程序,其行为都将出乎意料) (存储过程,任何编程语言的脚本等)满足以下条件:

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

虽然这可行,但绝对不建议这样做。另外,它很杂乱又昂贵。没有真正的理由要做这样的事情。最好适当地索引表并在查询时进行排序

答案 2 :(得分:1)

至少在InnoDB中,行的存储顺序由主键决定:

  

InnoDB表将数据安排在磁盘上,以基于主键优化查询。

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

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   |
+----+--------+