【问题标题】:SQL Request : Display people who are not friendSQL 请求:显示不是朋友的人
【发布时间】:2013-12-12 01:36:37
【问题描述】:

我正在尝试实现一个“添加朋友”页面,但我不知道为用户显示所有他可以添加的人的正确 SQL 是什么。这是我的桌子:

用户

-id

-名称

友谊

-id_user

-id_friend

这是这篇文章的同一种数据库:friendship database schema

对于一个用户,我希望拥有所有与他不是朋友的用户,没有要求他成为朋友的用户以及没有被要求与他成为朋友的用户

编辑: 这是我想要的最接近的结果,我试过了:

SELECT *
FROM user user
LEFT JOIN friend friend ON user.id=friend.id
WHERE friend.id IS NULL AND friend.id_friend IS NULL

但它只会返回所有没有朋友的人。

提前致谢!

【问题讨论】:

  • 向我们展示您的尝试
  • 完成。我尝试了很多东西,但都没有结论

标签: mysql


【解决方案1】:

sqlFiddle demo 基于您在另一个链接问题中解释的friendship schema

/* --------------get users who are not friends with 'Tim' */
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
                 FROM friendship f
                 WHERE f.id_user = u1.id AND
                       f.id_friend = u2.id)
  AND NOT EXISTS(SELECT 1
                 FROM friendship f
                 WHERE f.id_user = u2.id AND
                       f.id_friend = u1.id)
AND u1.id != u2.id
AND u1.id = 1;

/* ---------------get users who have not asked 'Tim' to be a friend*/
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
                 FROM friendship f
                 WHERE f.id_user = u2.id AND
                       f.id_friend = u1.id)
AND u1.id != u2.id
AND u1.id = 1;

/*  ------------- get users who have not been asked by 'Tim' to be a friend */
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
                 FROM friendship f
                 WHERE f.id_user = u1.id AND
                       f.id_friend = u2.id)
AND u1.id != u2.id
AND u1.id = 1;

所有三个查询都已设置为基于Timu1.id = 1 搜索数据,只需将最后一个条件更改为您要查找的任何用户ID。

第一个查询可以组合成一个OR 条件,如下所示

/* get users who are not friends with 'Tim' */
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
                 FROM friendship f
                 WHERE (f.id_user = u1.id AND
                        f.id_friend = u2.id)
                     OR(f.id_user = u2.id AND
                        f.id_friend = u1.id))
AND u1.id != u2.id
AND u1.id = 1;

左连接解决方​​案sqlFiddle(您必须将 1 的 id 比较替换为您选择的用户 id,它们在第一个查询中出现 3 次,在第二个和第三个查询中出现两次)

/* get users who are not friends with 'Tim' */
SELECT u.id,u.name
FROM users u
LEFT JOIN friendship f ON
  (u.id=f.id_user AND f.id_friend = 1)
OR(u.id=f.id_friend AND f.id_user = 1)
WHERE
    f.id_friend IS NULL
AND u.id != 1;

/* get users who have not asked 'Tim' to be a friend */
SELECT u.id,u.name
FROM users u
LEFT JOIN friendship f ON
  (u.id=f.id_user AND f.id_friend = 1)
WHERE
    f.id_friend IS NULL
AND u.id != 1;

/* get users who have not been asked by 'Tim' to be a friend */
SELECT u.id,u.name
FROM users u
LEFT JOIN friendship f ON
  (u.id=f.id_friend AND f.id_user = 1)
WHERE
    f.id_friend IS NULL
AND u.id != 1;

【讨论】:

  • 非常感谢,这就是我要找的东西!
【解决方案2】:

不是他的朋友

应该这样做:

SELECT *
FROM users U
WHERE NOT id IN (
  SELECT F.id_friend
  FROM friendship F
  WHERE U.id = F.id_friend
    AND F.id_user = 1
)
AND id != 1

或者

SELECT U.*, F.*
FROM users U
LEFT JOIN friendship F
  ON U.id = F.id_friend
  AND F.id_user = 1
WHERE F.id_user IS NULL
  AND U.id != 1

然而,

谁还没有邀请他做朋友,谁还没有被要求和他做朋友

您的架构中没有此信息。

编辑:太早了:/

【讨论】:

  • 感谢您的回答,但它只返回没有任何朋友的人。我应该把给定用户的条件放在哪里,以向他不是朋友的人展示?
猜你喜欢
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
相关资源
最近更新 更多