SQL 从多个表中选择返回可用的内容

Posted

技术标签:

【中文标题】SQL 从多个表中选择返回可用的内容【英文标题】:SQL Select from multiple tables return what is available 【发布时间】:2018-04-02 23:50:20 【问题描述】:

我有三张表,一张用于用户,一张用于图像,一张用于将图像映射到用户。这是我的查询(简化):

"SELECT * FROM tb_users u, tb_images i, tb_mapimagestousers m
    WHERE
u.id = :userid
    AND
m.userid = u.id
    AND
i.id = m.imgid

只要有从所有表中提取的数据,此查询就会正常返回。如果没有分配给用户的图像,则图像或 mapimagestousers 表中将没有他们的条目,并且查询将返回一个空集(可以理解)。如何查询数据库,以便在没有分配图像的情况下,我仍然可以从用户表中获取任何内容?

【问题讨论】:

【参考方案1】:

永远不要FROM 子句中使用逗号。 始终使用正确、明确、标准的JOIN 语法。

然后你就会知道外连接了。

你想要:

SELECT *
FROM tb_users u LEFT JOIN
     tb_mapimagestousers miu
     ON miu.userid = u.id LEFT JOIN
     tb_images i
     ON miu.imgid = i.id
WHERE u.id = :userid;

【讨论】:

当您将这些连接串在一起时,它是否将所有返回的结果视为一个表?因此,如果我先进行一堆左连接,然后再进行右连接,那么就组合结果的方式而言,右连接会将整个左连接字符串视为一个表,对吧? 还有什么特别的原因为什么不在FROM 子句中使用逗号? 因为正确的 SQL 语法是使用显式的JOINs。逗号只是 1970 年代和 1980 年代定义的原始语言的保留。

以上是关于SQL 从多个表中选择返回可用的内容的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从多个表中选择 *

SQL 从多个表中选择列而不重复数据

在一个 sql 命令中从一个数据库表中选择多个计数

sql从多个表中获取值

如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?

从同一个表中的多个列中选择不同的值