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

时间:2014-04-07 17:26:37

标签: 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,“之后”在列表中排在第2位,因为我希望table1在count之前,然后在after之后,然后是table2,依此类推。但是我没有在这里得到它因为我截断它的大小现在是0。有什么想法吗?

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

2 个答案:

答案 0 :(得分:1)

尝试:

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

答案 1 :(得分:1)

使用子查询限制的一种简单方法是使用它加入,而不是在where子句中使用它;

SELECT db_stats.table_name, db_stats.description, db_stats.table_rows 
FROM db_stats 
JOIN ( 
  SELECT table_name FROM db_stats WHERE description = 'before' 
  ORDER BY data_length + index_length DESC LIMIT 3
) q ON db_stats.table_name = q.table_name
ORDER BY data_length + index_length DESC

An SQLfiddle to test with