我已经创建了这个SQLFiddle演示,以便更好地理解这个问题。
首先,我会尽力告诉你我想做什么。人们可以通过Facebook创建自己的组页面。我让人们可以在自己的社交网络项目中建立自己的群组页面。我们知道facebook正在主页上以推荐组的名义显示。有两个或更多不同的建议组。这正是我想要做的。我想在我的主页上显示建议的组。
正如您在查询中看到的那样,有一些条件可用,分别如下:
1-)设置组的人将不会看到他在推荐组中设置的组。
2-)此人无法从推荐的组中看到加入的组。
在推荐的群组中,我只想展示两个建议的群组。
查询在这里:
SELECT
G.group_id,
G.group_owner_id,
G.group_name,
G.group_title,
G.group_cover,
F.group_oid,
F.group_user_id
FROM group_users F
INNER JOIN groups G
ON G.group_id = F.group_oid
WHERE
G.status = '1' AND
F.group_oid <> '10' AND
F.group_user_id <> '10'
GROUP BY
F.group_oid
ORDER BY rand()
LIMIT 2
您可以按如下方式测试演示的第一个问题:
数字10是谁创建了组sapsik(group_id 16)。查询必须在输出中禁用此行,因为我们在此查询中使用10。
F.group_oid <> '10' AND
F.group_user_id <> '10'
您还可以使用以下方法测试第二个问题:
8号没有创建他自己的组,8号刚刚加入16组(qazxsw poi)。但是,如果您更改以下这样的行
table group_users, row group_oid 16 , group_user_id 8
8号继续看到仍在注册的组。
你真的需要取F.group_oid <> '8' AND
F.group_user_id <> '8'
和F.group_oid
吗?
如果没有,您可以使用此查询:
F.group_user_id
您的查询的问题是,如果两个用户在同一个组中,SELECT
G.group_id,
G.group_owner_id,
G.group_name,
G.group_title,
G.group_cover
FROM groups G
WHERE
G.status = '1' AND
G.group_id NOT IN (
SELECT F.group_oid
FROM group_users F
WHERE F.group_oid = '10' OR
F.group_user_id = '10'
)
ORDER BY rand()
LIMIT 2
将始终为true。
使用后聚合过滤的另一个版本。要记住:WHERE过滤具有过滤器组的行。
F.group_user_id <> '10'