如何将Mysql中的表与空表连接起来

Posted

技术标签:

【中文标题】如何将Mysql中的表与空表连接起来【英文标题】:How to join tables in Mysql with empty table 【发布时间】:2015-07-05 23:13:48 【问题描述】:

我有四个这样的表:

公司(名称、描述)

company_users (company_id, user_id)

用户(id,group_id)

user_profiles (user_id, fullname)

我想列出广告系列。

我的代码是这样的:

SELECT companies.*, user_profiles.fullname as company_contact
FROM companies
INNER JOIN company_users ON companies.id = company_users.company_id
INNER JOIN users ON company_users.user_id = users.id AND users.group_id=500
INNER JOIN user_profiles ON users.id = user_profiles.user_id;

当我添加新广告系列时不会出现。因为 company_id 不在 company_users 中。

我该如何解决这个问题?

注意:每个广告系列必须只有一个用户。该用户的 group_id 为 500。

谢谢

编辑:

表格:

companies
1   |   Test Company    |   Test Desciption
2   |   Test Company 2  |   Test Description 2



company_users
1   |   18  |   1
2   |   19  |   1

users
18  |   500     
19  |   900


user_profiles
18  |   18  |   Test Contact
19  |   19  |   Test User

左连接结果:

1   Test Company    Test Description    Test Contact
1   Test Company    Test Description    NULL
2   Test Company 2  Test Description 2  NULL

INNER JOIN 结果:

1   Test Company    Test Description    Test Contact

我需要这个:

1   Test Company    Test Description    Test Contact
1   Test Company 2  Test Description 2  NULL

【问题讨论】:

用户 LEFT JOIN 而不是 INNER JOIN 这是基本 SQL 这是很好的阅读 ***.com/questions/38549/… 不,这可能不简单。当我使用 LEFT 时,列出了所有用户的所有公司。我只需要列出 group_id eq 500 的公司。我更新了我的答案。添加了查询结果 【参考方案1】:

听起来我们想要外部联接操作。

我们可以用关键字LEFT替换所有出现的关键字INNER

然后查询将返回来自companies 的行,即使在company_users 中没有找到匹配的行。

编辑

响应提供附加信息的问题编辑。

如果我们想要返回公司中的每一行,以及来自相关用户的单行的全名(如所需的结果集中所示),我们可以在 SELECT 列表中使用关联子查询,而不是连接操作.

例如:

  SELECT c.*
       , ( SELECT p.fullname
             FROM company_users cu
             JOIN users ON u.id = cu.user_id AND u.group_id=500
             JOIN user_profiles p ON p.user_id = u.id 
            WHERE cu.company_id = c.id
            ORDER BY p.fullname ASC
            LIMIT 1
         ) AS company_contact
    FROM companies c

子查询包含对companiesid 列的引用。对于从外部查询返回的每一行(来自companies 的每一行),使用来自companies 行的id 值执行SELECT 列表中的子查询,

如果子查询没有找到要返回的行,则返回 NULL 值。 LIMIT 1 子句确保我们最多返回一行(如果子查询返回多行,则会返回错误。)包含 ORDER BY 只是为了使结果更具确定性。也就是说,如果子查询恰好返回多行,ORDER BY 将对行进行排序,LIMIT 1 将获得排序后的第一行。

【讨论】:

感谢您的回答。当我使用 LEFT 时,列出了所有用户的所有公司。我只需要列出 group_id eq 500 的公司。我更新了我的答案。添加了查询结果 我添加了一个示例查询,该查询利用相关子查询从 user_profiles 表中返回 fullname,而不是使用连接操作。

以上是关于如何将Mysql中的表与空表连接起来的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 将日期维度表与另一个关于日期值的表连接起来

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

如何将一个表与每个 id 的两条记录连接起来?

如何将 html 风格化表与 php 和 sql 连接起来

如何将一个表与另一个表中的一系列值连接起来?

如何将系统表或信息架构表与 Redshift 中的用户定义表连接起来