我正在尝试根据子查询的顺序对表的行进行排序。至少,这就是我认为我正在尝试做的事情!
我正在查看的任务是记录一些统计数据,然后(在进行一些其他更改之后)以易于比较的格式再次获取相同的统计数据。我正在编写一个显示前后统计数据的简单报告 - 所以我希望将我的行组合在一起。
所以第一步是获取初始统计数据 - 这是关于数据库大小的统计数据:
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/