使用LEFT JOIN后获取行的重复

时间:2017-01-18 08:53:47

标签: mysql

我想连接3个表。但是当我这样做时,我得到了一些列的重复。

查询:

SELECT DISTINCT pl.projectNo, pl.proc_leader, pc.proc_checker, ps.proc_staff FROM proc_leader pl
LEFT JOIN proc_checker pc ON pl.projectNo=pc.projectNo
LEFT JOIN proc_staff ps ON pl.projectNo=ps.projectNo
WHERE pl.projectNO="17010002" ORDER BY pl.projectNo

我从查询中得到的是:

| projectNo | proc_leader | proc_checker | proc_staff | 
+-----------+-------------+--------------+------------+
| 170002    | BARIKAN     |    BENNY     |   BOBBY    |
| 170002    | BARIKAN     |    BENNY     |   CHRIS    |

所以问题是我只有一个BARIKAN和BENNY,但它复制了名字。我需要的是连接表而不重复,如果没有名称,它应该只是空格。

我想要的是:

| projectNo | proc_leader | proc_checker | proc_staff | 
+-----------+-------------+--------------+------------+
| 170002    | BARIKAN     |    BENNY     |   BOBBY    |
| 170002    |             |              |   CHRIS    |

proc_staff table:
| projectNo | process | proc_staff |
+-----------+---------+------------+
| 170002    | CGI MOD |   BOBBY    |
| 170002    | CGI MOD |   CHRIS    |

4 个答案:

答案 0 :(得分:1)

奇怪的请求,您的数据是tabellar,但是......试试这个:

子查询检查在同一项目中您的实际人员元素之前是否存在员工,您显示信息,而不是您设置为NULL(或者如果您希望您可以使用'' as空字符串)

SELECT
    DISTINCT pl.projectNo, 
    CASE
        WHEN (SELECT COUNT(*)
             FROM proc_staff ps2
             WHERE ps2.project_no = ps.project_no
             AND ps2.proc_staff < ps.proc_staff) = 0
        THEN pl.proc_leader
        ELSE NULL
    END,
    CASE
        WHEN (SELECT COUNT(*)
             FROM proc_staff ps2
             WHERE ps2.project_no = ps.project_no
             AND ps2.proc_staff < ps.proc_staff) = 0
        THEN pc.proc_checker
        ELSE NULL
    END,
    ps.proc_staff
FROM proc_leader pl
LEFT JOIN proc_checker pc
    ON pl.projectNo = pc.projectNo
LEFT JOIN proc_staff ps
    ON pl.projectNo = ps.projectNo
WHERE pl.projectNO="17010002" ORDER BY pl.projectNo

答案 1 :(得分:0)

您似乎在proc_checker表或proc_staff中有多个具有相同projectNo的行。

答案 2 :(得分:0)

可能有用的东西是group_concat函数:

SELECT DISTINCT pl.projectNo, pl.proc_leader, pc.proc_checker, group_concat(ps.proc_staff SEPARATOR ', ') FROM proc_leader pl
LEFT JOIN proc_checker pc ON pl.projectNo=pc.projectNo
LEFT JOIN proc_staff ps ON pl.projectNo=ps.projectNo
WHERE pl.projectNO="17010002" ORDER BY pl.projectNo

结果应该是这样的:

| projectNo | proc_leader | proc_checker | proc_staff       | 
+-----------+-------------+--------------+------------------+
| 170002    | BARIKAN     |    BENNY     |   BOBBY, CHRIS   |

答案 3 :(得分:0)

尝试此查询

SELECT DISTINCT 
    pl.projectNo, 
    if(@i=0, p1.proc_leader, ''), 
    if(@i=0, pc.proc_checker, ''), 
    ps.proc_staff,
    @i:=@i+1
FROM (select @i:=0) as tmp, proc_leader pl
    LEFT JOIN proc_checker pc ON pl.projectNo=pc.projectNo
    LEFT JOIN proc_staff ps ON pl.projectNo=ps.projectNo
WHERE 
    pl.projectNO="17010002" 
ORDER BY 
    pl.projectNo