【问题标题】:MySql Multiple Table query with left join带有左连接的 MySql 多表查询
【发布时间】:2017-02-01 03:20:33
【问题描述】:

我问这个是因为我找不到使用左连接查询多个表的确切示例,而且我对使用连接有点陌生。我在这里要做的是加入表user_listleave_record,以便从基于user_list 表的两个表中获取数据。因为不这样做,一些还没有休假记录的用户将不会被显示出来。

现在当我运行以下代码时,它显示Unknown column 'a.id' in 'on clause'。但是该列确实存在于我的表中。如果有人能指出我的错误,我将不胜感激。先感谢您。 :-)

SELECT a.id,
       CONCAT(a.firstname, a.lastname) AS "name",
       a.date_joined,a.job_status,
       d.description,
       d.annual_cf AS 'allowed_cf',
       f.2016 AS "lastyear",
       g.2016 AS "last_annual_cf",
       h.2016 AS "ot_convert",
       f.2017 AS "current_ent",
       g.2017 AS "current_annual_cf",
       h.2017 AS "current_ot_convert",
      SUM(CASE WHEN b.start_date BETWEEN c.entitlement_start_date AND
                    c.entitlement_extention_date AND
                    b.submit_date BETWEEN c.entitlement_start_date AND
                    c.system_freez_start_date AND b.leave_type = '1' AND
                    b.s_status = 'Approved' AND b.status <> 'Canceled'
               THEN b.no_days ELSE 0 END) a_annual
FROM user_list a,
     leave_records b,
     system_settings c,
     job_category d, 
     annual_leave_ent f,
     annual_cf g,
     ot_convert h
LEFT JOIN (SELECT id FROM leave_records) AS ba
    ON a.id = ba.id
WHERE f.id = a.id AND a.enabled <> 'no' AND g.id = a.id AND h.id = a.id AND
      d.id = a.job_category AND a.company='14' AND
      c.year_id='2016'
GROUP BY a.id
ORDER BY a.id

【问题讨论】:

  • 您使用了别名b 两次。此外,您使用的是旧式连接语法。尽量避免在FROM 子句中放置逗号。
  • 我已经编辑了我的代码并将我的左连接别名更改为ba,但结果仍然相同..不是逗号分隔表格吗?。
  • 为什么在列别名周围使用单引号?使用AS "name" 或仅使用AS name 而不是AS 'name'
  • 我以为它们是一样的……谢谢蒂姆。
  • 结果还是一样..还是返回错误Unknown column 'a.id' in 'on clause'

标签: mysql join left-join


【解决方案1】:

不要将连接操作的旧式逗号语法与较新的 JOIN 关键字混用。并将连接谓词移动到适当的ON 子句而不是WHERE 子句。

(放弃逗号语法的时代已经过去了;JOIN 关键字已经存在了足够长的时间,以至于很难将其称为“更新”。对于任何新查询,放弃逗号。(是的,逗号语法仍然有效,但这是为了兼容性,所以古老的 SQL 仍然可以运行。)

我不明白为什么您需要leave_records 表的交叉联接和外部联接。但目前尚不清楚您要达到的目标。

我们不知道id 在引用的表中是否是唯一的。在不了解这一点的情况下,似乎有可能产生半笛卡尔积。

没有样本数据,也没有可比较的预期结果,我们只是猜测。

但就LEFT OUTER JOIN 的查询语法而言,我认为查询看起来像这样。 (请注意,删除了对leave_records 的第一个引用。)

SELECT a.id
     , CONCAT(a.firstname,a.lastname) AS `name`
     , a.date_joined
     , a.job_status
     , d.description
     , d.annual_cf  AS `allowed_cf`
     , f.2016       AS `lastyear`
     , g.2016       AS `last_annual_cf`
     , h.2016       AS `ot_convert`
     , f.2017       AS `current_ent`
     , g.2017       AS `current_annual_cf`
     , h.2017       AS `current_ot_convert`
     , SUM( CASE
            WHEN b.start_date BETWEEN c.entitlement_start_date
                                  AND c.entitlement_extention_date
            AND b.submit_date BETWEEN c.entitlement_start_date
                                  AND c.system_freez_start_date
            AND b.leave_type        = '1'
            AND b.s_status          = 'Approved'
            AND b.status           <> 'Canceled'
           THEN b.no_days
           ELSE 0
           END
       ) AS a_annual
  FROM user_list a
  JOIN system_settings c
    ON c.year_id = '2016'
  JOIN job_category d
    ON d.id = a.job_category
  JOIN annual_leave_ent f
    ON f.id = a.id 
  JOIN annual_cf g
    ON g.id = a.id
  JOIN ot_convert h
    ON h.id = a.id
  LEFT
  JOIN leave_record b
    ON b.id = a.id
 WHERE a.enabled <> 'no'
   AND a.company = '14'
 GROUP BY a.id
 ORDER BY a.id

我会测试查询没有 GROUP BY没有 SUM() 聚合,以验证查询是否返回我们期望的行。在我确定这一点后,我会添加 GROUP BYSUM() 聚合以获得综合结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2015-02-22
    • 2022-11-11
    相关资源
    最近更新 更多