SQL:如果不在表中则联接或仅选择一行

时间:2019-03-26 10:00:47

标签: mysql sql database

我有四个表:一个用户,一个配置文件(用户配置文件),一个配置文件和内容之间的关系以及一个内容。该内容表可能没有条目,一个用户配置文件只能有一个条目。

我想让所有在内容表中没有条目的用户,或者如果他们有多个条目,则只获得一个。

这是我当前的SQL:

SELECT
users.uid AS uid,
profile.id AS profile_id,
content.id AS content_id
FROM 
users users_data
LEFT JOIN profile profile_data ON users_data.id = profile_data.uid
LEFT JOIN content_for_profile content_profile ON profile_data.id = content_profile.pid
LEFT JOIN content content_data ON content_for_profile.content_id = content_data.id
JOIN (
SELECT content_data_join.id, content_data_join.uid
FROM content content_data_join
GROUP BY content_data_join.uid
) content_data_join ON content_for_profile.content_id=content_data_join.id
GROUP BY uid, profile_id, content_id
ORDER BY profile.created DESC

我试图添加简单的JOIN以从内容表中仅获得一个结果,并且它可以工作。但是,这样一来,我不会让用户在内容表中没有任何条目。

我被困了几个小时,尝试了很多事情……预先感谢您的帮助!

编辑:

用户示例

id
8
9
10

个人资料示例:

id uid
2000 8
2001 9
2002 10

content_for_profile示例:

id pid content_id
1 2000 100
2 2001 101
3 2001 102

内容示例:

id uid
100 8
101 9
102 9 

预期结果:

uid profile_id content_id
8 2000 100
9 2001 101
10 2002 NULL

1 个答案:

答案 0 :(得分:1)

要使用户无需在内容表中输入内容,可以使用where条件为

    SELECT
    users.uid AS uid,
    profile.id AS profile_id,
    content.id AS content_id
    FROM 
    users users_data
    LEFT JOIN profile profile_data ON users_data.id = profile_data.uid
    LEFT JOIN content_for_profile content_profile ON profile_data.id = content_profile.pid
    LEFT JOIN content content_data ON content_for_profile.content_id = content_data.id

    where content_data.id is null  

    ORDER BY profile.created DESC

如果没有聚集功能,则不应使用GROUP BY。这个不推荐使用的是大多数数据库,在最新版本的mysql中不允许

a 要仅获得一个内容值条目,则可以使用聚合功能,例如min()..max()

    SELECT
    users.uid AS uid,
    profile.id AS profile_id,
    min(content.id) AS content_id
    FROM 
    users users_data
    LEFT JOIN profile profile_data ON users_data.id = profile_data.uid
    LEFT JOIN content_for_profile content_profile ON profile_data.id = content_profile.pid
    LEFT JOIN content content_data ON content_for_profile.content_id = content_data.id

    GROUP BY users.uid ,profile.id 
    ORDER BY profile.created DESC