如何从具有状态列的多个表中使用多个连接检索数据

时间:2017-04-12 10:59:25

标签: mysql join left-join

我有三张桌子。 Boys_dress,Girls_dress和sleeve_dress

Boys_dress

id dress_name  status
1    sample1    1
2    Sampel2    1
3    Sampel3    1

Girls_dress

id    dress_name  status
1    Sampel4       1
2    Sampee5       1
3    Sampel6       1

Sleeve_dress

id boys_dress_id  girls_dress_id sleeve_name
1    2                2             Full
1    1                1             Half
1    1                3             Full
1    2                null          Full

从上面的boys_dress_id和girls_dress_id是可选列。 boys_dress_id和girls_dress_id列中的任何一个都必须包含数据。 通过连接具有status = 1

的数据的着装表,从带有衣服名称的sleeve_dress表中检索数据

我使用以下MySQL查询检索数据。但是,如果由于条件status = 1,boys_dress_id或girls_dress_id为空,我无法获取数据。即使girls_dress_id为null,我也需要检索boys_dress_id的数据。

select * 
from sleeve_dress sd 
    left join Boys_dress bd on bd.id = sd.boys_dress_id 
    left join girls_dress gd on gd.id = sd.girls_dress_id 
where bd.status = 1 
  AND gd.status = 1

1 个答案:

答案 0 :(得分:0)

status上的条件移至on子句:

select . . .  -- explicitly put the column names here
from sleeve_dress sd left join
     Boys_dress bd
     on bd.id = sd.boys_dress_id and bd.status = 1 left join
     girls_dress gd
     on gd.id = sd.girls_dress_id and gd.status = 1;

where子句(正如您所知)正在过滤掉不匹配的行,因为NULL状态与1不匹配。 on子句使条件成为join条件的一部分。

请注意,我已将select *替换为select . . .。合理的人不同意select *是否是一个表的好主意。但是,您有多个具有重叠列名称的表。在这种情况下,您希望显式列出所需的列,可能会为它们提供特定的别名(例如gd.status as gd_status)。