【问题标题】:JOIN 3 Table include not existing as nullJOIN 3 表包括不存在为空
【发布时间】:2020-10-27 08:33:06
【问题描述】:

我正在研究考勤管理网络查看器,需要一些关于查询数据的指南

我有 3 张桌子:

  1. 日期列表: date table
  2. 员工名单:employee table
  3. 考勤记录:attendance log

我想查询我的数据显示成这样

例子:

dates      | pin | time
2020-10-01 | 1   | 08:00:00
2020-10-01 | 2   | NULL
2020-10-01 | 3   | NULL
2020-10-02 | 1   | 08:01:00
2020-10-02 | 2   | NULL
2020-10-02 | 3   | NULL
2020-10-03 | 1   | 08:03:00
2020-10-03 | 2   | NULL
2020-10-03 | 3   | NULL
2020-10-04 | 1   | NULL
2020-10-04 | 2   | NULL
2020-10-04 | 3   | NULL

所以,不管考勤表上没有数据,查询仍然显示所有日期和密码列表,值为NULL, 我对 MySQL 的了解有限,最多只能做 JOIN 查询,但结果只在日期部分正确,显示所有日期而不显示所有用户。

我的查询:

SELECT d.dates, a.pin, u.name, a.time
FROM att_dates AS d -- This is the table with all days
LEFT JOIN att AS a ON d.dates = a.dates
LEFT JOIN att_user u ON a.pin = u.pin
GROUP BY dates, pin
ORDER BY d.dates

这是 SQL Fiddle 上的数据库副本 SQL 小提琴:http://sqlfiddle.com/#!9/91e1ea/2

【问题讨论】:

  • FROM date_table d CROSS JOIN employee_table e LEFT JOIN attend_table a ON d.date=a.date AND e.emp_id=a.emp_id

标签: mysql sql left-join cross-join


【解决方案1】:

考虑cross join将日期和用户生成所有可能的组合,然后将考勤表与left join一起引入:

SELECT d.dates, u.pin, u.name, a.time
FROM att_dates AS d
CROSS JOIN att_user u
LEFT JOIN att AS a ON d.dates = a.dates AND a.pin = u.pin
GROUP BY d.dates, u.pin, u.name
ORDER BY d.dates

【讨论】:

  • select 列与group by 列不一致。所以即使数据库碰巧接受了这个,它也是一个格式错误的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多