【问题标题】:MYSQL | Get two different records from single tableMYSQL |从单个表中获取两条不同的记录
【发布时间】:2015-02-15 21:01:45
【问题描述】:

好的。这有点复杂..我一直在努力实现它,但到目前为止没有任何进展。

我有三张桌子。 leave_approval leave_applications ml_leave_type

这是 leave_approval 表

然后从 leave_application_id 链接到 leave_application

现在棘手的问题来了, 我想要两个表中的记录。

  1. 我想要员工在 2014 年的休假总数
  2. 我想要员工在 2014 年 11 月的总休假数

所以意味着需要两列,每年和每月有两种不同的方法。

到目前为止我有查询。

SELECT 
  LA.employee_id,
  DATEDIFF(
    LA.approved_to,
    LA.approved_from
  ) AS TotalLeavesTaken,
  LAPP.`entitlement_id`,
  LAPP.`ml_leave_type_id`,
  LA.leave_application_id,
  LA.approved_from AS LeaveFrom,
  LA.approved_to AS LeaveTo 
FROM
  leave_approval LA 
  INNER JOIN leave_application LAPP 
    ON LAPP.application_id = LA.leave_application_id 
WHERE YEAR(LA.approval_date) = 2014
  AND LA.`employee_id` = 1

这是我得到的查询结果..

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

更新

我可能无法清楚地解释我的问题。

我想要实现的是添加两个额外的列而不是删除我拥有的列。我的意思是我正在使用我拥有的大多数/所有选择字段

另外,我希望将 2014 年的总叶数放在一个列中,并将该月的总叶数放在该给定年份的不同字段中。

所以这是我想要的例子。>

ml_leave_type_id | Total Leaves Taken in Year (e-g 2014) | Total Leaves taken in Month (e-g November)
     1                          10                                 2
     2                           6                                 0
     3                           4                                 1

【问题讨论】:

  • 没有照片谢谢。恰到好处的 DDL!

标签: mysql database


【解决方案1】:

Edit2:在需求澄清后更新了选择语句。更新包括使用 JOIN 而不是 UNION ALL 进行重组

select a.*, b.*
from (
    SELECT 
      LA.employee_id,
      DATEDIFF(
        LA.approved_to,
        LA.approved_from
      ) AS TotalLeavesTaken,
      LAPP.`entitlement_id`,
      LAPP.`ml_leave_type_id`,
      LA.leave_application_id,
      LA.approved_from AS LeaveFrom,
      LA.approved_to AS LeaveTo
    FROM
      leave_approval LA 
      INNER JOIN leave_application LAPP 
        ON LAPP.application_id = LA.leave_application_id 
    WHERE YEAR(LA.approval_date) = 2014
      AND LA.`employee_id` = 1 
) a

JOIN (
    SELECT 
      LA.employee_id,
      DATEDIFF(
        LA.approved_to,
        LA.approved_from
      ) AS TotalLeavesTaken,
      LAPP.`entitlement_id`,
      LAPP.`ml_leave_type_id`,
      LA.leave_application_id,
      LA.approved_from AS LeaveFrom,
      LA.approved_to AS LeaveTo 
    FROM
      leave_approval LA 
      INNER JOIN leave_application LAPP 
        ON LAPP.application_id = LA.leave_application_id 
    WHERE MONTHNAME(LA.approval_date) = 'November'
      AND LA.`employee_id` = 1
) b
ON a.employee_id = b.employee_id

【讨论】:

  • 谢谢您的回复,但您使用了 SUM,我想为个别休假类型求和。我的意思是如果你在申请中看到有休假类型。所以我不想总结所有休假类型。我想获得每种休假类型的总和。例如,有 3 个病假批准和 2 个临时休假批准。所以我想要三个休假批准(可能是 10 天)和两个休假批准(可能是 4 天)的总和。我知道我很困惑,让我更新这个问题。
  • @SizzlingCode,我在问题更新/要求更新后修改了答案。请尝试查询,让我们知道这是否符合您的需求。我无法对其进行测试,因为您没有以易于使用的格式提供任何示例数据。查询可以改进并变得更优雅。
【解决方案2】:

这样可以吗?

employee_id = 1,2014 年的总休假

SELECT 
  LA.employee_id,
  SUM(
     DATEDIFF(
      LA.approved_to,
      LA.approved_from
     )
  ) AS TotalLeavesTaken,
  LAPP.`entitlement_id`,
  LAPP.`ml_leave_type_id`,
  LA.leave_application_id,
  LA.approved_from AS LeaveFrom,
  LA.approved_to AS LeaveTo 
FROM
  leave_approval LA 
  INNER JOIN leave_application LAPP 
    ON LAPP.application_id = LA.leave_application_id 
WHERE YEAR(LA.approval_date) = 2014
  AND LA.`employee_id` = 1
GROUP BY LA.`employee_id` = 1

employee_id = 1、Year = 2014 AND Month = 11 的总休假

SELECT 
  LA.employee_id,
  SUM(
     DATEDIFF(
      LA.approved_to,
      LA.approved_from
     )
  ) AS TotalLeavesTaken,
  LAPP.`entitlement_id`,
  LAPP.`ml_leave_type_id`,
  LA.leave_application_id,
  LA.approved_from AS LeaveFrom,
  LA.approved_to AS LeaveTo 
FROM
  leave_approval LA 
  INNER JOIN leave_application LAPP 
    ON LAPP.application_id = LA.leave_application_id 
WHERE YEAR(LA.approval_date) = 2014
  AND MONTH(LA.approval_date) = 11
  AND LA.`employee_id` = 1
GROUP BY LA.`employee_id` = 1

我确实注意到您的数据集中有一些日期重叠。例如:

employee_id = 1 在 2014/11/01 - 2014/11/06 和 2014/11/05 - 2014/11/08 休假。日期 2014/11/05 和 2014/11/06 是怎么回事。系统将如何处理这种情况

【讨论】:

  • 是的,它实际上是虚拟条目。 xD。但是员工 1 的日期还可以。所以这就是为什么我想和员工 1 一起工作 :)
猜你喜欢
  • 1970-01-01
  • 2013-01-09
  • 2016-12-01
  • 2011-08-31
  • 2012-06-18
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多