查询以了解以下内容

Posted

技术标签:

【中文标题】查询以了解以下内容【英文标题】:Query to find out following 【发布时间】:2014-03-25 23:30:36 【问题描述】:

我有一个用户表和一个友谊表 用户(ID、电子邮件、姓名) 友谊(id,user_id,friend_id,确认)

id   |  email  |  name
1    | xyz     | abc
2    | yui     | poi
3    | tar     | foo
4    | bar     | baz

如果 id 为 1 的用户向 id 为 2 的用户发送好友请求,那么与 id 为好友的行看起来像

id               |  user_id   |  friend_id  | confirmed
1(generated key) |  1         |  2          | false

现在当用户接受好友请求时

id               |  user_id   |  friend_id  | confirmed
1(generated key) |  1         |  2          | true
2                |  2         |  1          | true

所以我基本上想要做的是找出与当前用户不是朋友的用户,如果用户已经与用户成为朋友或者用户已经发送了好友请求,那么生成的哈希数组不应该包含该值.

所以在上述数据库中,哈希结果数组应该包含 id 为 3 和 4 的用户。

所以基本上在友谊表中 user_id 为好友请求发送者 ID,好友 ID 为接收者 ID

因此,无论 user_id 是 current_user,它都不应该有与该friend_id 对应的用户,反之亦然,如果friend_id 是当前用户,则它不应该显示具有相应 user_id 的用户

我希望问题足够清楚,可以理解

抱歉英语不好

【问题讨论】:

【参考方案1】:

试试这个:

select u.* from users u 
where u.id not in ( select user_id id from friendship 
                    union 
                    select friend_id from friendship );

如果您还想要当前用户的记录,请添加带有当前用户 ID 的 OR 子句。

select u.* from users u 
where u.id = ?
   OR u.id not in ( select user_id id from friendship 
                    union 
                    select friend_id from friendship );

用当前用户id填充参数并执行。

【讨论】:

这个解决方案看起来非常简单和合乎逻辑,但是在这个地方我可以在哪里只为当前登录的用户检查上述查询? 没有。你不能从这个查询。因为,您需要一个不在友谊用户和朋友 ID 中的用户列表。由于其他用户可能在他们的朋友 id 中有当前用户的 id,因此也将被省略。要获取当前用户的记录,只需在上述解决方案中添加OR 子句即可。

以上是关于查询以了解以下内容的主要内容,如果未能解决你的问题,请参考以下文章

Atitit sql计划任务与查询优化器--统计信息模块

响应式设计2---媒体查询基础知识

如何获取嵌套子查询以识别父查询列

了解用于内存空闲的普罗米修斯查询(节点导出器)

sqlserver怎么查看表的内容

XML查询