如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

Posted

技术标签:

【中文标题】如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零【英文标题】:How to fetch multiple columns from multiple table and show data on non empty columns and null or zero on empty columns using joins in MYSQL 【发布时间】:2014-11-25 03:18:01 【问题描述】:

我想知道如何从多个表中获取多个列,即使一个表中的一列不存在,并返回曾经存在于一个或多个用于连接的表中的列

例如:

表格:

user_pr_details:
 [id] [first_name] [last_name]
urname: 
 [id] [email] [username]
profile_pic:
 [id] [file_name ]

SQL:

SELECT a.first_name, a.last_name, b.username, c.file_name 
FROM user_pr_details a,urname b,profile_pic c 
WHERE a.user_id = b.urname_id 
and b.urname_id = c.user_id 
and c.user_id in (7,8,9)

问题:

for user_id in (7,8) all the columns in all three table exists..
whereas for user_id in (9) [file_name] doesn't exists in profile_pic table
so the query returns two rows for user_id in (7,8)

我需要什么? 如果一个表中不存在一列,则返回具有数据的其余列,并在不存在的 col 的位置显示 null 或零。

【问题讨论】:

【参考方案1】:

我想建议这个查询。

SELECT
      upd.first_name
    , upd.last_name
    , u.username
    , pp.file_name
FROM urname u
LEFT OUTER JOIN user_pr_details a ON u.urname_id = upd.user_id
LEFT OUTER JOIN profile_pic pp ON u.urname_id = pp.user_id
WHERE u.urname_id  IN (7, 8, 9)

在创建 SQL 查询时,您首先需要做出的选择是“来自表”。也就是说,您将引用的第一个表。这是一个重要的选择!理想情况下,该表对查询“始终可用”,而其他表“将关联但不控制”查询逻辑。

这个查询是关于用户的,所以关于用户的主表应该是“从表”。

之后我们需要“加入”其他信息,您已经在进行加入,但是您通过 where clausejoin conditions 以老式方式执行此操作,例如 a.user_id = b.urname_id(尽管这存在于 where 子句中它仍然是一个连接条件)。我改用了 ANSI 92 连接语法,这样做的好处之一是我可以轻松地使用“外部”连接。这些连接类型允许记录存在于一个表中但不存在于另一个表中。 LEFT OUTER JOIN 指的是左侧的“来自表”,因此记录可能存在于表 urname 中,而 user_pr_details 或 profile_pic 中没有任何匹配的记录。

如果不熟悉这种语法,我推荐this visual guide to joins,但请注意“OUTER”是一个可选词,因此LEFT OUTER JOIN 通常只是“LEFT JOIN”

请注意我也更改了WHERE clause。如果可能,我们希望确保我们过滤信息的方式适用于“来自表”,因为这样我们允许来自其他表的 NULL。


小提示:我使用了不同的表别名。我更喜欢这些与表名有关系,所以 'u' 代表 urname; user_pr_details 的“更新”;以及 profile_pic 的“pp”。我个人认为 a、b、c 太抽象了,如果你需要调整查询结构,那么它们很容易乱序(就像它们对我所做的那样!)

【讨论】:

以上是关于如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中的表的多个列中查找连接的字符串

如何正确使用连接/子查询从多个表中选择数据? (PHP-MySQL)

如何使用会话ID从php mysql中的两个或多个表中获取值

如何保留使用多个连接的密钥?

从多个表中获取所有列的最大值

如何在火花中连接多个列,同时从另一个表中连接列名(每行不同)