在sql中使用连接 - 没有得到所有想要的结果

时间:2014-06-01 13:33:27

标签: php mysql sql join

我试图使用以下sql查询我的mysql数据库:

$sql = "
    SELECT
    t1.Discipline,
    t4disc.Color,
    t4disc.Naam,
    t1.Date_Posted,
    t2ploeg.Naam PloegId,
    t1.Cat,
    t1.Tekst,
    t3user.Naam PosterId,
    t3user.Voornaam
    FROM Log_Logboek_".$log." t1
    JOIN Log_Ploegen_".$log." t2ploeg ON t1.PloegId = t2ploeg.ID
    JOIN Log_Users t3user ON t1.PosterId = t3user.ID
    JOIN Log_Disciplines t4disc ON t1.Discipline = t4disc.ID
    ". $where ."
    AND t1.Discipline in ($vis_ids)
    ORDER by Date_Posted asc;
     ";    

此查询可以正常工作并提供结果。连接的唯一问题是,如果其中一个连接的表不包含匹配的Id,则该行将完全从结果中跳过。 例如,假设用户从Log_Users表中删除,而在此查询中跳过所有带有其ID的记录,因为t1.PosterId没有匹配的用户。

有没有办法加入这些表,所以我可以在一个查询中完成,并仍然得到结果中的所有行?如果是这样,我可以用某种方式替换丢失的身份证吗?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为这是您想要的查询:

SELECT t1.Discipline, t4disc.Color, t4disc.Naam, t1.Date_Posted, t2ploeg.Naam PloegId,
       t1.Cat, t1.Tekst, t3user.Naam PosterId, t3user.Voornaam
FROM Log_Logboek_".$log." t1 LEFT JOIN
     Log_Ploegen_".$log." t2ploeg
     ON t1.PloegId = t2ploeg.ID LEFT JOIN
     Log_Users t3user
     ON t1.PosterId = t3user.ID LEFT JOIN
     Log_Disciplines t4disc
     ON t1.Discipline = t4disc.ID
". $where ."t1.Discipline in ($vis_ids)
ORDER by Date_Posted asc;

where子句中的条件位于第一个表中,因此它将相应地过滤行。如果条件没有匹配,那么所有条件都可能被过滤掉。

如果将where条件移动到on子句,则左外连接会发生奇怪的事情。 on条件失败,但该行仍保留在结果集中 - 这就是左外连接的工作方式。