如何使用空表

时间:2015-07-05 23:13:49

标签: mysql join

我有四张这样的表:

公司(标题,描述)

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

1 个答案:

答案 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

请注意子查询中idcompanies列的引用;对于从公司返回的每一行,该行的id值将用于执行该子查询。如果子查询没有找到要返回的行,则查询将返回NULL值。 LIMIT 1子句确保我们最多返回一行。包含ORDER BY只是为了使结果更具确定性。如果子查询碰巧返回多行,ORDER BY将确定返回哪个值。