我想连接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 |
答案 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