我有四张这样的表:
公司(标题,描述)
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中。
我该如何解决这个问题?
注意:Eeach广告系列必须只有一个用户。该用户的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
LEFT JOIN结果:
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
答案 0 :(得分:1)
听起来您想要外部联接操作。
尝试使用关键字INNER
替换所有出现的关键字LEFT
。
然后,即使在companies
中找不到匹配的行,您的查询也会从company_users
返回行。
修改强>
回应提供附加信息的问题编辑。
如果要返回公司中的每一行,以及来自相关用户的单行的全名(如所需结果集中所示),则可以在SELECT列表中使用correlate子查询,而不是连接操作
例如:
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
请注意子查询中id
中companies
列的引用;对于从公司返回的每一行,该行的id
值将用于执行该子查询。如果子查询没有找到要返回的行,则查询将返回NULL值。 LIMIT 1
子句确保我们最多返回一行。包含ORDER BY
只是为了使结果更具确定性。如果子查询碰巧返回多行,ORDER BY
将确定返回哪个值。