MySQL:查询联合,使用条件WHERE连接
假设我们有以下表格、员工和工资单: 表:雇员MySQL:查询联合,使用条件WHERE连接,mysql,sql,join,union,Mysql,Sql,Join,Union,假设我们有以下表格、员工和工资单: 表:雇员 id_employee | name_employee | ============|===============| 1 | john | 2 | doe | 3 | alex | 表:工资单 id_slip | id_employee | month_slip | year_slip | ====
id_employee | name_employee |
============|===============|
1 | john |
2 | doe |
3 | alex |
表:工资单
id_slip | id_employee | month_slip | year_slip |
========|=============|============|===========|
1 | 1 | 01 | 2016 |
2 | 2 | 01 | 2016 |
3 | 1 | 02 | 2016 |
4 | 2 | 02 | 2016 |
5 | 1 | 03 | 2016 |
6 | 3 | 03 | 2016 |
我们希望得到以下结果,其中月结单='03'
和年结单='2016'
id_employee | month_slip | year_slip | status_slip
============|============|===========|============
1 | 03 | 2016 | paid
2 | 03 | 2016 | unpaid
3 | 03 | 2016 | paid
我尝试了以下查询:
SELECT
a.id_employee,
payroll_slip.month_slip,
payroll_slip.year_slip,
IF(a.id_employee=payroll_slip.id_employee, 'paid', 'unpaid') AS status_slip
FROM (
SELECT id_employee FROM employee
UNION
SELECT id_employee FROM payroll_slip
) a
LEFT OUTER JOIN payroll_slip ON a.id_employee = payroll_slip.id_employee
LEFT OUTER JOIN employee ON a.id_employee = employee.id_employee
WHERE payroll_slip.month_slip = '03' AND payroll_slip.year_slip = '2016'
SELECT e.id_employee, '03' AS month_slip, '2016' AS year_slip,
CASE WHEN p.id_employee IS NOT NULL THEN 'paid' ELSE 'unpaid' END AS status_slip
FROM employee e LEFT JOIN payroll_slip p
ON e.id_employee = p.id_employee AND p.month_slip = '03' AND p.year_slip = '2016'
对此有何建议?尝试以下查询:
SELECT
a.id_employee,
payroll_slip.month_slip,
payroll_slip.year_slip,
IF(a.id_employee=payroll_slip.id_employee, 'paid', 'unpaid') AS status_slip
FROM (
SELECT id_employee FROM employee
UNION
SELECT id_employee FROM payroll_slip
) a
LEFT OUTER JOIN payroll_slip ON a.id_employee = payroll_slip.id_employee
LEFT OUTER JOIN employee ON a.id_employee = employee.id_employee
WHERE payroll_slip.month_slip = '03' AND payroll_slip.year_slip = '2016'
SELECT e.id_employee, '03' AS month_slip, '2016' AS year_slip,
CASE WHEN p.id_employee IS NOT NULL THEN 'paid' ELSE 'unpaid' END AS status_slip
FROM employee e LEFT JOIN payroll_slip p
ON e.id_employee = p.id_employee AND p.month_slip = '03' AND p.year_slip = '2016'
这里的技巧是在
JOIN
条件中,而不是在WHERE
子句中,移动对month\u slip
和year\u slip
的限制
按照下面的链接进行运行演示:
尝试交叉连接:
SELECT X.id_employee, X.month_slip, X.year_slip
, CASE WHEN Y.id_employee IS NULL THEN 'Unpaid' ELSE 'Paid' END AS status_slip
FROM (
SELECT A.id_employee, B.month_slip, B.year_slip
from employee A
cross join (
select '03' AS month_slip, '2016' AS year_slip
) B
) X
LEFT JOIN payroll_slip Y
ON X.id_employee = Y.id_employee
AND X.month_slip = Y.month_slip
AND X.year_slip = Y.year_slip
id\u employee=2
的month\u slip
和year\u slip
将为null
。很好的捕获…没有看到id\u employee 2在您按书面方式运行查询时会显示出来。如果您混淆了左联接
并使用了内部联接
或只是联接
,则ie_employee 2将不会显示。