SQL左连接只产生第一个表中的数据

时间:2017-04-10 12:49:12

标签: mysql sql

这是我的疑问:

select dr.*, v.hash, d.* from directory d 
left join directory_relations dr on d.id = dr.directory_id 
left join videos v on dr.video_id = v.id

这是结果: enter image description here 结果只有5行,但在directory_relations中是6行。 表: directory_relations enter image description here

表:目录

enter image description here

看起来喜欢错过有关VIDEO的数据。但我不知道为什么,因为在VIDEO表格中存在id为14059的行。

2 个答案:

答案 0 :(得分:0)

您的第一个left join保留directory表中的所有行,而不是directory_relations中的行。为了保留这两者,你需要一个full outer join,但MySQL不支持该操作。要模拟它,您可以编写像

这样的查询
select  t1.*, v.hash
from    (
            select  dr.*, d.id as d_id, d.name, d.user_id
            from    directory d 
            left join
                    directory_relations dr
            on      d.id = dr.directory_id 
            union
            select  dr.*, d.id as d_id, d.name, d.user_id
            from    directory_relations dr 
            left join
                    directory d
            on      d.id = dr.directory_id 
        ) t1
left join
        videos v
on      t1.video_id = v.id

答案 1 :(得分:0)

您正在使用LEFT JOIN,它将返回左表中的所有行,以及右表中具有匹配项的所有行。这就是ID = 9的原因不会被退回:因为它出现在右边的桌子上,但是左边的桌子上没有ID = 0的目录。

您可能希望切换表的顺序......或者您可能希望在目录表中添加ID = 0的目录,但哪种解决方案更好取决于数据库的逻辑。