我有如下所示的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中是不可能的(我只是想知道),则可以在显示数据时使用其他方法解决我的问题。感谢您的帮助。
答案 0 :(得分:3)
我想对表本身中的数据重新排序
表中唯一存在的实际物理顺序是磁盘上群集的主键。这将是id
列,而不是字体名称。但是,无论如何,总的来说,您应该在SQL级别进行,前提是假设表是按照无序记录集建模的。
因此,如果要按某种方式对字体列进行排序,则应使用ORDER BY
:
SELECT *
FROM yourTable
ORDER BY font;
我应该补充一点,如果您想要一个可以通过字体名称快速搜索表的结构,则可以在该列上添加索引。然后,将有一个按字体排序的物理结构,但它不是您的实际表,而是一个B树。
答案 1 :(得分:1)
我从MySQL中学到的一件事是,任何没有相对简单明了的文档来完成的事情,由于某种原因都没有
MySQL中没有这样的东西。就是说,您可能会花费大量资源并强制执行此操作(请记住,它可能会与您的索引以及绝对与您的主键混为一谈,因此无论您拥有的依赖于表的任何应用程序,其行为都将出乎意料) (存储过程,任何编程语言的脚本等)满足以下条件:
order by
子句对其进行排序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 |
+----+--------+