我正在尝试根据子查询的顺序为表格排序。至少,这就是我认为我想做的事情!
我正在研究的任务是记录一些统计数据,然后(在其他一些变化之后),以易于比较的格式再次获得相同的统计数据。我正在写一个简单的报告,显示前后的统计数据 - 所以我希望将我的行组合在一起。
所以第一步是获取初始统计数据 - 它是关于数据库大小的统计数据:
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。有什么想法吗?
我认为我的部分问题可能是我不知道这项技术是否有名称;我已经尝试搜索有关排序/子查询的内容,但实际上找不到任何看似相关的内容。
答案 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