Mysql union order by 总结一下

昨天今天一直纠结一个问题,关于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打开。这也是我们经常用的方式,来提交报表。

如果大家有更好的方法,可以提供交流。共同学习。

 

你可能感兴趣的:(Mysql union order by 总结一下)