MySql 左连接多表查询

标签 mysql join left-join

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

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

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

最佳答案

不要将连接操作的旧式逗号语法与较新的 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() 聚合以获得合并结果。

关于MySql 左连接多表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971358/

相关文章:

sql - 用日期表填补日期空白

php - 我想在回显表单元格中放置一个按钮

mysql - cakePHP - 加入条件虚拟字段

NHibernate 左外连接

nhibernate - 使用 NHibernate ICriteria/QueryOver 查询向外连接添加条件

sql - 通过使用 VIEW 而不是 JOIN,我可以获得任何性能优势吗?

MYSQL 慢 ORDER BY

python - 使用 python 更新 mysql 中的列时出错

python - 在 MySQL 中存储非常大的整数

mysql - 令人困惑 无法打开 PDO 连接 无法连接到 MySQL 服务器