MySQL - 根据子查询的顺序对结果进行排序

标签 mysql

我正在尝试根据子查询的顺序对表的行进行排序。至少,这就是我认为我正在尝试做的事情!

我正在查看的任务是记录一些统计数据,然后(在进行一些其他更改之后)以易于比较的格式再次获取相同的统计数据。我正在编写一个显示前后统计数据的简单报告 - 所以我希望将我的行组合在一起。

所以第一步是获取初始统计数据 - 这是关于数据库大小的统计数据:

DROP TABLE IF EXISTS db_stats;
CREATE TABLE db_stats ( id INT UNSIGNED NULL AUTO_INCREMENT, table_name VARCHAR (255) NOT NULL, data_length BIGINT UNSIGNED NOT NULL, index_length BIGINT UNSIGNED NOT NULL, table_rows BIGINT NOT NULL, avg_row_length SMALLINT NOT NULL, description VARCHAR (255) NOT NULL,  PRIMARY KEY (id), UNIQUE INDEX unique_key(table_name,description));
INSERT INTO db_stats (table_name,data_length,index_length,table_rows,avg_row_length,description)(SELECT table_name, data_length,index_length,table_rows,avg_row_length, "before" FROM information_schema.tables);

第 2 步 - 我截断了数据库中最大的表。

第 3 步 - 新统计数据:

INSERT INTO db_stats (table_name,data_length,index_length,table_rows,avg_row_length,description)(SELECT table_name, data_length,index_length,table_rows,avg_row_length, "after" FROM information_schema.tables);

现在,找到前 3 个表:

SELECT table_name, description, table_rows 
FROM db_stats 
WHERE table_name IN ( SELECT table_name 
                      FROM db_stats 
                      WHERE description = "before" 
                      ORDER BY data_length + index_length DESC) 
ORDER BY data_length + index_length DESC LIMIT 6

假设我的表称为 table1、table2、table3 等(按总大小排序)。我的结果是

table1, "before"
table2, "before"
table2, "after"
table3, "before"
table3, "after"
table4, "before" <--- I didn't want this one

我希望 table1,“after”在列表中排在第二位,因为我希望 table1 在 count 之前,然后是 count 之后,然后是 table2,依此类推。但是我在这里没有得到它,因为自从我截断它后大小现在为 0。有什么想法吗?

我认为我的部分问题可能是我不知道是否有这种技术的名称;我尝试搜索有关排序/子查询的内容,但找不到任何看起来相关的内容。

最佳答案

尝试:

SELECT d.table_name, d.description, d.table_rows 
FROM db_stats d
JOIN db_stats x ON d.table_name = x.table_name
                AND x.description = "before"
ORDER BY x.data_length + x.index_length DESC,
         d.table_name,
         d.description DESC
LIMIT 6

关于MySQL - 根据子查询的顺序对结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919133/

相关文章:

php - mysql:向 php 发送 sqlstate 信号

mysql - 在将某些内容插入到外键引用的子表之前查找主键的值

MySQL 上一行计算

php - 用户限制 - 在数据库中还是直接到文件中? (灵活性与性能?)

php - 如何将 WHERE 用于自定义字段(别名)?

php - 避免跨越重量范围 BETWEEN,两列?数据库

mysql - 2 个表的 INSERT 问题

php - 为什么 max_allowed_pa​​cket 没有效果?

mysql - 当mysql插入表达到wait_timeout限制时发生了什么

mysql - CakePHP - 使用复杂的 MySQL 查询创建虚拟字段