查询没有给出我想要的结果

时间:2017-12-26 10:17:36

标签: php sql database

我已经创建了 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
  1. 第一个问题是:人们从建议的群体中看到自己的群体。一世 不想在此查询中建议显示自己的组。

  2. 第二个问题是:人们从建议中看到他加入的小组 组。我不想在此建议中展示他加入的小组 查询。

  3. 您可以按如下方式测试演示的第一个问题:

    数字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号继续看到仍在注册的组。

2 个答案:

答案 0 :(得分:4)

您真的需要抓取F.group_oidF.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