查询每人每天的数据

首先先建表

CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `repair` (
`name` varchar(255) DEFAULT NULL,
`repair_num` varchar(255) DEFAULT NULL,
`repair_second` varchar(255) DEFAULT NULL,
`date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `talair` (
`name` varchar(255) DEFAULT NULL,
`talair_num` varchar(255) DEFAULT NULL,
`talair_second` varchar(255) DEFAULT NULL,
`date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入测试数据:

这个时间表也可以使用存储过程进行生成,有需要的请参考上一篇博客

表数据建立好了,那么怎么使用mysql实现需求呢?

先使用传统的inner join 与left join 试试

inner join 的效果,显然这是将两张表数据相同数据进行连接,数据不准确,且没有按照时间去进行分组,时间统计不准确

需要的效果是

这样,但是需要去除笛卡尔积,按照人与时间进行分类

由于第一张表有的数据,第二张表没有,且时间不同,那么现在就需要借助创建的user表与date表

可以这样写:

select * from user join date
left join repair on repair.name = user.name and date.date = repair.date
left join talair on talair.name = user.name and date.date = talair.date;

效果是:

这样就查询出了张三这个人在9-17这天,进行了1次拖车1与4次小修,达到了按时间去分组查询每人每天数据的目的,且不会因为数据表不完全而导致数据丢失

接下来就是去除产生的笛卡尔积,可以直接将为null的值排除

SELECT
* FROM
USER JOIN date
LEFT JOIN REPAIR ON REPAIR.NAME = USER.NAME
AND date.date = REPAIR.date
LEFT JOIN talair ON talair.NAME = USER.NAME
AND date.date = talair.date
WHERE
talair.talair_num IS NOT NULL
OR talair.talair_second IS NOT NULL
OR REPAIR.repair_num IS NOT NULL or REPAIR.repair_second is not null ;

这其中有一点是非常重要的,就是user表与date表两个表完全不相关,是通过拖车与小修两张表进行的关联

在写报表的过程中,通常是写周月日的统计,那么会先建立一张日维表或者月维表,但是却与主表不关联,只是作为一个时间字段展示,那么这种连接方式就

显得尤为重要

最新文章

  1. laravel5.1学习(2)-- artisan tinker命令
  2. javascript工具函数
  3. 高性能JavaScript DOM编程
  4. qq2440启动linux后插入u盘出现usb 1-1: device descriptor read/64, error -110,usb 1-1: device not accepting address 8, error -110
  5. mac安装django1.5.4
  6. Hibernate核心思想—ORM机制(一)
  7. [Ubuntu] Linux下使用google app engine,无法打开https网站的解决方法
  8. array_intersect() php筛选两个数组共有的元素
  9. 查找Safari相关迹证
  10. css新增UI样式
  11. KMP算法初探
  12. OC之Copy语法
  13. AngularJS尝鲜一
  14. javaScript 连续子数列最大和
  15. linux日志(常用命令)
  16. ajax传递的数据类型json传递
  17. hdu 3954 线段树 (标记)
  18. Sublime Text3 离线安装Package Control并使用GBK编码 --转自https://blog.csdn.net/swhard/article/details/78930371
  19. python-mysql数据库导表存excel后发邮件(实例2)
  20. Linux基础入门之vsFTP+MySQL/MariaDB认证实现虚拟用户配置详解

热门文章

  1. linux下使用ntfs-3g挂载NTFS出错
  2. ubuntu或者debian安装php-gd扩展错误
  3. POJ 2182 Lost Cows 【树状数组+二分】
  4. o'Reill的SVG精髓(第二版)学习笔记——第三章
  5. 用c#语言编写水仙花数
  6. LeetCode13.罗马数字转整数 JavaScript
  7. LeetCode8.字符串转换整数(atoi) JavaScript
  8. BFC、IFC、GFC、FFC
  9. oracle-03 表的管理
  10. ios学习路线—Objective-C(堆(heap)和栈(stack))