左联接不显示不匹配记录

时间:2019-06-03 11:38:56

标签: mysql sql

我有一个带有连接的简单mysql查询

Select

sp.PTPK, sp.EmployeeNamePK, sp.Half, sp.TaskPK, sp.TaskAssignCompletionId, sp.SwitchDate, sp.SpendDays, /*switch_person Table*/

pro.Name as ProjectName, pro.TeamLead /*Project Table*/

From switch_person sp


LEFT JOIN projects pro
ON pro.PK = sp.PTPK

Where sp.SwitchDate = '2019-03-01'
AND sp.Half =1

有一个问题,即project不匹配的记录未显示,这是正确的。我的意思是有些不匹配的记录(项目名称)不是我从项目表中获得的。我知道应该在使用left join时显示它。

2 个答案:

答案 0 :(得分:0)

上次发表评论后更新。

如果确实要始终显示项目数据,我认为左连接可能会更好。除此之外,如果问题出在性能上,我建议您:

  1. 在switch_person表中添加索引
  2. 为您的查询创建存储过程(SP)

赞:

CREATE INDEX mydataindex ON switch_person(PTPK, SwitchDate, Half);

CREATE
    PROCEDURE getmydata (IN filterdate date, IN half INT)
SELECT sp.PTPK
     , sp.EmployeeNamePK
     , sp.Half
     , sp.TaskPK
     , sp.TaskAssignCompletionId
     , sp.SwitchDate
     , sp.SpendDays
     , pro.Name ProjectName
     , pro.TeamLead 
  FROM projects pro
  LEFT 
  JOIN switch_person sp
    ON pro.PK = sp.PTPK
   AND sp.SwitchDate = filterdate
   AND sp.Half = half
ORDER BY 
   pro.Name;

然后,您要做的就是像这样调用该SP:

CALL getmydata ('2019-03-01', 1);

更新了完整代码here

答案 1 :(得分:0)

怎么样...

SELECT sp.PTPK
     , sp.EmployeeNamePK
     , sp.Half
     , sp.TaskPK
     , sp.TaskAssignCompletionId
     , sp.SwitchDate
     , sp.SpendDays
     , pro.Name ProjectName
     , pro.TeamLead 
  FROM projects pro
  LEFT 
  JOIN switch_person sp
    ON pro.PK = sp.PTPK
   AND sp.SwitchDate = '2019-03-01'
   AND sp.Half = 1

...?