2016-03-28 72 views
0

我在使用INNER JOIN查询时遇到问题。MYSQL加入条件可能为空

我有两个表。我需要部门名称和所有三个批准者。如果任何审批者都是NULL,我也需要显示。

mysql> desc department; 
+-------------------+----------+------+-----+---------+----------------+ 
| Field    | Type  | Null | Key | Default | Extra   | 
+-------------------+----------+------+-----+---------+----------------+ 
| id    | int(8) | NO | PRI | NULL | auto_increment | 
| departmentName | tinytext | YES |  | NULL |    | 
| primaryApprover | int(8) | YES |  | NULL |    | 
| secondaryApprover | int(8) | YES |  | NULL |    | 
| tertiaryApprover | int(8) | YES |  | NULL |    | 
+-------------------+----------+------+-----+---------+----------------+ 

mysql> desc approver; 
+------------------+------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+------------------+------------+------+-----+---------+----------------+ 
| id    | int(8)  | NO | PRI | NULL | auto_increment | 
| approverName  | tinytext | YES |  | NULL |    | 
| approverPosition | tinytext | YES |  | NULL |    | 
| approverLogonId | tinytext | YES |  | NULL |    | 
| approverEmail | tinytext | YES |  | NULL |    | 
| isActive   | tinyint(1) | YES |  | NULL |    | 
+------------------+------------+------+-----+---------+----------------+ 

下面的查询工作,但它并没有给我数据,其中一次或二次审批是NULL:

SELECT 
    a.departmentName as DEPARTMENT, 
    pa.approvername as PRIMARY, 
    sa.approvername as SECONDARY, 
    ta.approvername as TERTIARY 
FROM 
    department as a 
INNER JOIN 
    approver pa on a.primaryapprover=pa.id 
INNER JOIN 
    approver sa on a.secondaryapprover = sa.id 
INNER JOIN 
    approver ta on a.tertiaryapprover = ta.id 
ORDER BY 
    a.departmentname; 

使用此查询,我得到这样的结果:

+--------------------------------+---------------------------+---------------------------+------------------------+ 
| DEPARTMENT      | PRIMARY_APPROVER   | SECONDARY_APPROVER  | TERTIARY_APPROVER  | 
+--------------------------------+---------------------------+---------------------------+------------------------+ 
| Facilities      | Washburn, Hoban   | Cobb, Jayne    | Reynolds, Malcomn  | 
| Personnel/HR     | Frye, Kaylee    | Serra, Inara    | Book, Dariel   | 
+--------------------------------+---------------------------+---------------------------+------------------------+ 
2 rows in set (0.00 sec) 

但应该得到这个结果:

+--------------------------------+---------------------------+---------------------------+------------------------+ 
| DEPARTMENT      | PRIMARY_APPROVER   | SECONDARY_APPROVER  | TERTIARY_APPROVER  | 
+--------------------------------+---------------------------+---------------------------+------------------------+ 
| Business Office    | NULL      | Rample, Fanty    | Niska, Adelei   | 
| Facilities      | Washburn, Hoban   | Cobb, Jayne    | Reynolds, Malcomn  | 
| Personnel/HR     | Frye, Kaylee    | Serra, Inara    | Book, Dariel   | 
| Technical Services    | Tam, River    | NULL      | Tam, Simon    | 
+--------------------------------+---------------------------+---------------------------+------------------------+ 
4 rows in set (0.00 sec) 

我不擅长连接......我在这里错过了什么?

+2

看起来你可以尝试用'LEFT JOIN'替换所有'INNER JOIN'。这不会消除连接表中具有空值的行。 –

回答

1

只需使用LEFT JOINS

SELECT 
    a.departmentName as DEPARTMENT, 
    pa.approvername as PRIMARY, 
    sa.approvername as SECONDARY, 
    ta.approvername as TERTIARY 
FROM 
    department as a 
LEFT JOIN 
    approver pa on a.primaryapprover=pa.id 
LEFT JOIN 
    approver sa on a.secondaryapprover = sa.id 
LEFT JOIN 
    approver ta on a.tertiaryapprover = ta.id 
ORDER BY 
    a.departmentname; 

INNER JOIN - 只保留从双方匹配的记录。

LEFT JOIN - 保留左表中的所有记录,并且只记录右表中的记录。

您也可以使用COALESCE将空值替换为默认值(如'-1'或其他值)。