使用JOIN ON

时间:2017-05-25 12:09:34

标签: mysql select null

让我看看这3张桌子:

主表:

  ID | OtherStuff1 | OtherStuff2 | IdProvince | IdTown 
-----+-------------+-------------+------------+--------
   1 |   Stuff1    |   Stuff2    |    NULL    |   1    
-----+-------------+-------------+------------+--------
   2 |   Stuff3    |   Stuff4    |      1     |  NULL    

省表:

ID | ProvinceName 
---+--------------
 1 |  ProvName1   

城镇表:

ID |   TownName   
---+--------------
 1 |   TwName1  

然后我使用其中一个sql打印信息,使其显示名称而不是Id编号。

SELECT a.Id, OtherStuff1, OtherStuff2, ProvinceName, TownName 
    FROM main AS a 
    LEFT JOIN (province AS b, town AS c) 
    ON (a.IdProvince = b.Id AND a.IdTown = c.Id) 
    WHERE a.IdProvince=1;

SELECT a.Id, OtherStuff1, OtherStuff2, ProvinceName, TownName 
    FROM main AS a 
    LEFT JOIN (province AS b, town AS c) 
    ON (a.IdProvince = b.Id AND a.IdTown = c.Id) 
    WHERE a.IdTown=1;

问题在于,当它打印结果时,它会像这样:

  ID | OtherStuff1 | OtherStuff2 | ProvinceName | TownName 
-----+-------------+-------------+--------------+--------
   1 |   Stuff1    |   Stuff2    |    NULL      |  NULL    

如果其中一个id被置为NULL,那么即使有其他带有数字的id,它也会置为NULL。如果不删除该列的null连接,我该如何避免这种情况:

SELECT a.Id, OtherStuff1, OtherStuff2, ProvinceName, IdTown 
    FROM main AS a 
    LEFT JOIN (province AS b) 
    ON (a.IdProvince = b.Id) 
    WHERE a.IdProvince=1;

如果IdTown为NULL但是我不想要这个解决方案,这会有效,因为有很多行和很多其他列有Id'并且不可能一个一个地检查哪一个是NULL而哪一个不是。

所以我想要一个像这样的查询,但是当有一个null时,它不会弄乱其他Id将它们全部置为NULL。

SELECT a.Id, OtherStuff1, OtherStuff2, ProvinceName, TownName 
    FROM main AS a 
    LEFT JOIN (province AS b, town AS c) 
    ON (a.IdProvince = b.Id AND a.IdTown = c.Id) 
    WHERE a.IdProvince=1;

很抱歉,此查询的预期结果如下:

  ID | OtherStuff1 | OtherStuff2 | ProvinceName | TownName 
-----+-------------+-------------+--------------+--------
   2 |   Stuff1    |   Stuff2    |  ProvName1   |  NULL    

有什么想法吗?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

  1. 不要混合连接符号(如果使用ANSI92标准,则from子句应避免使用。如果使用ANSI 89标准,则应该没有左连接语法)
  2. 我认为没有理由不做两个左连接回主表(A)一个用于省,一个用于城镇...
  3. SELECT a.Id, OtherStuff1, OtherStuff2, ProvinceName, TownName 
    FROM main AS a 
    LEFT JOIN province AS b
      ON a.IdProvince = b.Id 
    LEFT JOIN town as c 
     ON a.IdTown = c.Id
    WHERE a.IdProvince=1;
    

答案 1 :(得分:0)

这是因为ON子句中的条件:

=Month(Now())

在这里,只有在满足两个条件时才要求LEFT JOIN 2表格,在你的情况下它们不会。

我会尝试将2个连接分开,如下所示:

a.IdProvince = b.Id AND a.IdTown = c.Id