Mysql union order by 总结一下
2013-01-16 17:06
337 查看
昨天今天一直纠结一个问题,关于mysql order by 后导出数据记录为excel 。
导出后发现 没有表头。于是搜罗各种办法去为导出的文件添加表头。
方法一:
用 union
例如:该例句为统计一周以内所有数据库表记录变化的情况。
SELECT 'db_name','tab_name',CURDATE()-0 , CURDATE()-1, CURDATE()-2,CURDATE()-3,CURDATE()-4,CURDATE()-5,CURDATE()-6,CURDATE()-7, 9999999999 as dif_rowcount
union all
select a.table_schema,a.table_name,CURDATE(),sum(a.count1),sum(a.count2),
sum(a.count3),sum(a.count4),sum(a.count5),sum(a.count6),sum(a.count7), sum(a.count1)-sum(a.count7) dif_rowcount from
(
SELECT table_schema,table_name, DATE_FORMAT(create_time,'%Y-%m-%d') create_date,
SUM(CASE WHEN date(create_time) = date(SYSDATE()) THEN table_rowcount ELSE 0 END) count1,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 1 DAY)) THEN table_rowcount ELSE 0 END) count2,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 2 DAY)) THEN table_rowcount ELSE 0 END) count3,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 3 DAY)) THEN table_rowcount ELSE 0 END) count4,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 4 DAY)) THEN table_rowcount ELSE 0 END) count5,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 5 DAY)) THEN table_rowcount ELSE 0 END) count6,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 6 DAY)) THEN table_rowcount ELSE 0 END) count7
FROM db_sys_stat.t_table_stat1
WHERE create_time > DATE_SUB(CURDATE(),INTERVAL 7 DAY)
GROUP BY table_schema,table_name ,DATE_FORMAT(create_time,'%Y-%m-%d')
) a
group by a.table_schema,a.a.table_name
having sum(a.count1)-sum(a.count7) <> 0
order by dif_rowcount desc
注意:1.9999999999 as dif_rowcount 为什么用数据999999999为表名呢,是因为如果union 排序时默认为按字符排序,只有是数字了才按数字排序。
2. order by 排序后,如果用union 则union又重新整合排序。
3. 纵表变横表的问题。
4. mysql日期函数的问题。
方法二:
mysql -u -p -e " sql 语句" >/tmp/aaa.txt
例如:与上面的功能一样,都是查询一周内数据库数据表记录变化的情况。用该句能导出的数据记录带表头,更能达到我们的要求。
mysql -uroot -proot@centos -e "select a.table_schema,a.table_name,CURDATE(),sum(a.count1),sum(a.count2), sum(a.count3),sum(a.count4),sum(a.count5),sum(a.count6),sum(a.count7), sum(a.count1)-sum(a.count7) dif_rowcount from
( SELECT table_schema,table_name, DATE_FORMAT(create_time,'%Y-%m-%d') create_date, SUM(CASE WHEN date(create_time) = date(SYSDATE()) THEN table_rowcount ELSE 0 END) count1, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 1 DAY)) THEN
table_rowcount ELSE 0 END) count2, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 2 DAY)) THEN table_rowcount ELSE 0 END) count3, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 3 DAY)) THEN table_rowcount ELSE 0 END)
count4, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 4 DAY)) THEN table_rowcount ELSE 0 END) count5, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 5 DAY)) THEN table_rowcount ELSE 0 END) count6, SUM(CASE WHEN date(create_time)
= date(DATE_SUB(SYSDATE(),INTERVAL 6 DAY)) THEN table_rowcount ELSE 0 END) count7 FROM db_sys_stat.t_table_stat1 WHERE create_time > DATE_SUB(CURDATE(),INTERVAL 7 DAY) GROUP BY table_schema,table_name ,DATE_FORMAT(create_time,'%Y-%m-%d') ) a group by
a.table_schema,a.a.table_name having sum(a.count1)-sum(a.count7) <> 0 order by dif_rowcount desc" > /tmp/aaa.txt
总结:可以导出表头的记录。同时也实现我们要排序的目的,综合起来该方法是最好的。比union添加表头后的更完善,更符合我们的要求。
以上为 把数据库查询的记录导出成excel的方法,同时需要注意mysql 的union order by 细节问题,也要注意mysql 的日期的函数。虽然第二种方法导出的文件为.txt文本文件,但是可以用excel打开。这也是我们经常用的方式,来提交报表。
如果大家有更好的方法,可以提供交流。共同学习。
导出后发现 没有表头。于是搜罗各种办法去为导出的文件添加表头。
方法一:
用 union
例如:该例句为统计一周以内所有数据库表记录变化的情况。
SELECT 'db_name','tab_name',CURDATE()-0 , CURDATE()-1, CURDATE()-2,CURDATE()-3,CURDATE()-4,CURDATE()-5,CURDATE()-6,CURDATE()-7, 9999999999 as dif_rowcount
union all
select a.table_schema,a.table_name,CURDATE(),sum(a.count1),sum(a.count2),
sum(a.count3),sum(a.count4),sum(a.count5),sum(a.count6),sum(a.count7), sum(a.count1)-sum(a.count7) dif_rowcount from
(
SELECT table_schema,table_name, DATE_FORMAT(create_time,'%Y-%m-%d') create_date,
SUM(CASE WHEN date(create_time) = date(SYSDATE()) THEN table_rowcount ELSE 0 END) count1,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 1 DAY)) THEN table_rowcount ELSE 0 END) count2,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 2 DAY)) THEN table_rowcount ELSE 0 END) count3,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 3 DAY)) THEN table_rowcount ELSE 0 END) count4,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 4 DAY)) THEN table_rowcount ELSE 0 END) count5,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 5 DAY)) THEN table_rowcount ELSE 0 END) count6,
SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 6 DAY)) THEN table_rowcount ELSE 0 END) count7
FROM db_sys_stat.t_table_stat1
WHERE create_time > DATE_SUB(CURDATE(),INTERVAL 7 DAY)
GROUP BY table_schema,table_name ,DATE_FORMAT(create_time,'%Y-%m-%d')
) a
group by a.table_schema,a.a.table_name
having sum(a.count1)-sum(a.count7) <> 0
order by dif_rowcount desc
注意:1.9999999999 as dif_rowcount 为什么用数据999999999为表名呢,是因为如果union 排序时默认为按字符排序,只有是数字了才按数字排序。
2. order by 排序后,如果用union 则union又重新整合排序。
3. 纵表变横表的问题。
4. mysql日期函数的问题。
方法二:
mysql -u -p -e " sql 语句" >/tmp/aaa.txt
例如:与上面的功能一样,都是查询一周内数据库数据表记录变化的情况。用该句能导出的数据记录带表头,更能达到我们的要求。
mysql -uroot -proot@centos -e "select a.table_schema,a.table_name,CURDATE(),sum(a.count1),sum(a.count2), sum(a.count3),sum(a.count4),sum(a.count5),sum(a.count6),sum(a.count7), sum(a.count1)-sum(a.count7) dif_rowcount from
( SELECT table_schema,table_name, DATE_FORMAT(create_time,'%Y-%m-%d') create_date, SUM(CASE WHEN date(create_time) = date(SYSDATE()) THEN table_rowcount ELSE 0 END) count1, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 1 DAY)) THEN
table_rowcount ELSE 0 END) count2, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 2 DAY)) THEN table_rowcount ELSE 0 END) count3, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 3 DAY)) THEN table_rowcount ELSE 0 END)
count4, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 4 DAY)) THEN table_rowcount ELSE 0 END) count5, SUM(CASE WHEN date(create_time) = date(DATE_SUB(SYSDATE(),INTERVAL 5 DAY)) THEN table_rowcount ELSE 0 END) count6, SUM(CASE WHEN date(create_time)
= date(DATE_SUB(SYSDATE(),INTERVAL 6 DAY)) THEN table_rowcount ELSE 0 END) count7 FROM db_sys_stat.t_table_stat1 WHERE create_time > DATE_SUB(CURDATE(),INTERVAL 7 DAY) GROUP BY table_schema,table_name ,DATE_FORMAT(create_time,'%Y-%m-%d') ) a group by
a.table_schema,a.a.table_name having sum(a.count1)-sum(a.count7) <> 0 order by dif_rowcount desc" > /tmp/aaa.txt
总结:可以导出表头的记录。同时也实现我们要排序的目的,综合起来该方法是最好的。比union添加表头后的更完善,更符合我们的要求。
以上为 把数据库查询的记录导出成excel的方法,同时需要注意mysql 的union order by 细节问题,也要注意mysql 的日期的函数。虽然第二种方法导出的文件为.txt文本文件,但是可以用excel打开。这也是我们经常用的方式,来提交报表。
如果大家有更好的方法,可以提供交流。共同学习。
相关文章推荐
- Mysql Order By 注入总结
- MYSQL order by排序与索引关系总结
- MYSQL order by排序与索引关系总结
- MYSQL之union和order by分析([Err] 1221 - Incorrect usage of UNION and ORDER BY)
- MYSQL order by排序与索引关系总结
- mysql 5.7.15 union order by 子查询排序不生效
- MYSQL order by排序与索引关系总结
- MYSQL之union和order by分析([Err] 1221 - Incorrect usage of UNION and ORDER BY)
- Mysql Order By注入总结
- MYSQL order by排序与索引关系总结
- MYSQL order by排序与索引关系总结
- mysql 5.7.15 union order by 子查询排序不生效
- Mysql Order By 注入总结
- mysql 5.7.15 union order by 子查询排序不生效
- mysql union order by 分别排序问题
- Mysql Order By 注入总结
- MYSQL order by排序与索引关系总结
- Mysql order by的一些技巧
- order by union 应用实例 mssql
- mysql order by 多字段排序