MySQL JOIN语句的问题

时间:2012-01-30 10:26:57

标签: mysql database join

我有5个表称为个人,每日支付,奖金,我和贷款我试图编写一个查询,将从该表生成工资单......我的代码是

 select personal.name as NAME, 
   (sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY 
    from personal 
      join dailypay on personal.eid = dailypay.eid 
      left join bonuses on personal.eid = bonuses.eid 
      left join iou on personal.eid = iou.eid 
      left join where dailypay.date = 'specified_date' 
                  and bonuses.date_approved = 'specified_date' 
                  and iou.date_approved = 'specified_date' 
                  and loans.date = month(now()

它返回具有奖金,iou和贷款记录的员工的姓名和空薪水值。但我想总结他们的每日支付,扣除/增加扣除或增加返回值,如果没有记录它应继续进行总和而不做任何扣除或减法。

2 个答案:

答案 0 :(得分:1)

粘贴代码时错过了一些内容,因为loans表没有连接。此外,您使用表bonuses作为值,您还需要一个字段名称。我为联接和字段添加了一些代码,但是使用了???来表示我不知道的名称。

当您向其他内容添加或减去空值时,结果为null,这就是当缺少左连接表中的任何值时,结果为null的原因。您可以使用ifnull(..., 0)将空值转换为零。

你需要一个group by条款,否则它会总结所有人的工资。

如果我说得对,那么每个用户的dailypay表中有几条记录,但其他表中每个用户只有一条记录?在这种情况下,您遇到的问题是,您将在dailypay中的每一行加入其他表,因此如果您有20个用户付款记录,则会将奖励计为20次。您可以使用max之类的聚合来获取值一次。

您已在where子句中为left.joined表添加条件,但这会将连接转换为内连接。您应该在每个join子句中都有这些条件。

select
  personal.name as NAME, 
  (sum(dailypay.pay) + ifnull(max(bonuses.???), 0)) - (ifnull(max(iou.amount), 0) + ifnull(max(loans.monthly_due), 0)) as SALARY 
from
  personal 
  inner join dailypay on personal.eid = dailypay.eid 
  left join bonuses on personal.eid = bonuses.eid and bonuses.date_approved = 'specified_date'
  left join iou on personal.eid = iou.eid and iou.date_approved = 'specified_date'
  left join loans on personal.??? = loans.??? and loans.date = month(now())
where
  dailypay.date = 'specified_date' 
group by
  personal.name

答案 1 :(得分:0)

left join之前似乎有一个无关的where,而)

中有一个错过的结束括号month(now()

所以看起来应该是这样的:

select personal.name as NAME, 
(sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY 
from personal 
  join dailypay on personal.eid = dailypay.eid 
  left join bonuses on personal.eid = bonuses.eid 
  left join iou on personal.eid = iou.eid 
  where dailypay.date = 'specified_date' 
              and bonuses.date_approved = 'specified_date' 
              and iou.date_approved = 'specified_date' 
              and loans.date = month(now())