如何在MySQL中查询两个表,并在第二个表中没有记录时返回NULL?

3

我正在使用 MySQL 5.0.88,需要从两个表中选择数据,它们分别叫做 articlesmedia

当我上传图片到服务器时,我需要查询用户的所有文章,并查看是否已经在媒体表中指定了路径(字段 type="img"),以避免进行不必要的覆盖。

我希望能够在我的查询中包含 m.type,但我无法让它工作。

我的查询如下:

SELECT DISTINCT a.style, a.filename, a.path, m.type
    FROM articles AS a
    LEFT JOIN mnedia AS m
       ON a.iln = m.iln
    WHERE
       a.iln = id_12345
       AND m.type = "img"
       AND m.type IS NOT NULL

这使我得到了用户id_12345的所有文章(正确),但是type字段总是img,尽管媒体表只有一条记录用于文章abc
问题: 如何查询才能返回用户的所有文章(有效),对于未列在表media中的文章,显示type=NULL,对于列在表media中的文章(如abc),显示type="img"
感谢您的帮助!
编辑: 表articles可能包含以下记录:
abc 
d
e
f
g
媒体
表可能包括:
abc type=img

应该返回查询结果:
abc type=img
d type=NULL
e type=NULL
f type=NULL
g type=NULL

编辑
如果有记录不在 media 中,我也不介意获取所有在 articles 中的记录,例如在图像上的第二个连接左侧(“b.Key IS NULL”)。

解决方案: 好的。当连接两个表时,我需要检查除了用户ID之外的另一个字段。这是它的工作原理:

SELECT DISTINCT a.style, a.filename, a.path, m.type
    FROM articles AS a
    LEFT JOIN mnedia AS m
       ON a.iln = m.iln
       AND a.style= m.style
    WHERE
       a.iln = id_12345
       AND ( m.type = "img" OR m.type IS NULL )

感谢大家的建议!
2个回答

2

你应该在 LEFT JOIN 中加入 m.type = "img" 的条件,而不是将其放在 WHERE 子句中:

SELECT DISTINCT a.style, a.filename, a.path, m.type
FROM articles AS a
     LEFT JOIN mnedia AS m
         ON a.iln = m.iln
            AND m.type = "img"
WHERE a.iln = id_12345;

我试过了,但是它不起作用。我仍然得到了所有记录,并且每个记录都指定了“img”,而只有ABC应该有“img”,而所有其他记录应该为NULL、空字符串或其他什么? - frequent
这真的不应该发生 你确定mnedia表中没有设置type="img"的其他文章条目吗? - gabtub
刚刚找到了解决方法。只使用user_id进行左连接是问题所在,因为我实际上是在检查媒体表中是否存在用户的样式编号。请参见我的解决方案。 - frequent

1

我认为只需要稍微调整一下你的where子句,就足够了:

WHERE
       a.iln = id_12345
       AND (
              m.type = "img"
              OR m.type IS NULL
           )

由于你要查找的两个值是 "img" 和 NULL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接