如何将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
子查询包含对companies
中id
列的引用。对于从外部查询返回的每一行(来自companies
的每一行),使用来自companies
行的id
值执行SELECT 列表中的子查询,
如果子查询没有找到要返回的行,则返回 NULL 值。 LIMIT 1
子句确保我们最多返回一行(如果子查询返回多行,则会返回错误。)包含 ORDER BY
只是为了使结果更具确定性。也就是说,如果子查询恰好返回多行,ORDER BY
将对行进行排序,LIMIT 1
将获得排序后的第一行。
【讨论】:
感谢您的回答。当我使用 LEFT 时,列出了所有用户的所有公司。我只需要列出 group_id eq 500 的公司。我更新了我的答案。添加了查询结果 我添加了一个示例查询,该查询利用相关子查询从 user_profiles 表中返回fullname
,而不是使用连接操作。以上是关于如何将Mysql中的表与空表连接起来的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL 将日期维度表与另一个关于日期值的表连接起来