我有四个表:一个用户,一个配置文件(用户配置文件),一个配置文件和内容之间的关系以及一个内容。该内容表可能没有条目,一个用户配置文件只能有一个条目。
我想让所有在内容表中没有条目的用户,或者如果他们有多个条目,则只获得一个。
这是我当前的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
答案 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