我已经创建了 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(table group_users, row group_oid 16 , group_user_id 8
)。但是如果你像这样更改以下行
F.group_oid <> '8' AND
F.group_user_id <> '8'
8号继续看到仍在注册的组。
答案 0 :(得分:4)
您真的需要抓取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
您的查询存在的问题是,如果两个用户属于同一个群组,则F.group_user_id <> '10'
将始终为真。
答案 1 :(得分:3)
使用集合后过滤的另一个版本。要记住:WHERE过滤具有过滤器组的行。
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'
GROUP BY
F.group_oid
HAVING SUM(F.group_oid = 10)=0
AND SUM(F.group_user_id = 10)=0
ORDER BY rand()
LIMIT 2