MYSQL-左联接查询无法按预期工作

时间:2020-05-19 19:39:22

标签: mysql left-join

我在MYSQL数据库中有以下三个表:

CREATE TABLE `hr_leave_requests` (
  `id` int(11) UNSIGNED NOT NULL,
  `company_id` int(11) DEFAULT NULL,
  `employee_id` bigint(20) UNSIGNED DEFAULT NULL,
  `leave_type_id` int(11) UNSIGNED NOT NULL,
  `leave_status` tinyint(1) DEFAULT 0 COMMENT '0=Draft,1=Pending/Awaiting Approval, 2=Cancelled,3=Rejected,4=Approved',
  `no_of_days` int(10) UNSIGNED DEFAULT NULL,
  `is_active` tinyint(1) DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `hr_leave_types`
--

CREATE TABLE `hr_leave_types` (
  `id` int(11) UNSIGNED NOT NULL,
  `company_id` int(11) DEFAULT NULL,
  `leave_type_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `no_of_days` int(11) DEFAULT NULL,
  `is_active` tinyint(1) DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Table structure for table `hr_leave_type_details`
--

CREATE TABLE `hr_leave_type_details` (
  `id` int(11) NOT NULL,
  `company_id` int(11) DEFAULT NULL,
  `leave_type_id` int(11) NOT NULL,
  `employment_type_id` int(11) NOT NULL,
  `no_of_days` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `hr_leave_requests`
--
ALTER TABLE `hr_leave_requests`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `hr_leave_types`
--
ALTER TABLE `hr_leave_types`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `hr_leave_type_details`
--
ALTER TABLE `hr_leave_type_details`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `hr_leave_type_details_uniq1` (`company_id`,`leave_type_id`,`employment_type_id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `hr_leave_requests`
--
ALTER TABLE `hr_leave_requests`
  MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `hr_leave_types`
--
ALTER TABLE `hr_leave_types`
  MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `hr_leave_type_details`
--
ALTER TABLE `hr_leave_type_details`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;
  1. LeaveType:现在,我希望hr_leave_types中的所有Leave_type_name出现并通过employee_id和Leave_type_id与hr_leave_requests链接。

  2. 已授权:每位员工均有权根据leave_type_id和employment_type_id获得特定的no_of_days。因此,必须将hr_leave_type_details中的所有no_of_days显示为与所选员工的employment_type_id相关

  3. 已批准:对于休假状态为4的特定员工,hr_leave_requests中的no_of_days的总和。如果所有相关的字段都没有字段,则应分配零

  4. 可用:已授权-已批准

我在哪里运行此查询:

SELECT 
    lt.leave_type_name AS LeaveType,
    ltd.no_of_days as Authorized,
    SUM(lr.no_of_days) as Approved,
    SUM(ltd.no_of_days - lr.no_of_days) as Available
FROM hr_leave_types lt
LEFT JOIN hr_leave_requests lr on lr.leave_type_id = lt.id
  AND lr.leave_status = 4
  AND lr.employee_id = 17
  AND lr.company_id = 1
LEFT JOIN hr_leave_type_details ltd ON ltd.leave_type_id = lr.id
WHERE ltd.employment_type_id = 1
GROUP BY
    lt.leave_type_name,
    lt.no_of_days,
    ltd.no_of_days

因为表hr_leave_requests的雇员只有一个字段,所以我得到了以下结果:

query result

但是我需要这样的东西:

expected result

我该如何实现?

谢谢

0 个答案:

没有答案