自我加入在这里没有帮助。我还可以使用啥其他方法?

Posted

技术标签:

【中文标题】自我加入在这里没有帮助。我还可以使用啥其他方法?【英文标题】:Self joining doesn't help here. What other approach can I use?自我加入在这里没有帮助。我还可以使用什么其他方法? 【发布时间】:2016-06-28 12:24:54 【问题描述】:

我被这个问题困住了。考虑下表。我只知道值 A(即我可以使用 SELECT * from table WHERE user_one = A 之类的东西)。我尝试进行自我加入,但没有帮助。

给定表格

+----------+-----------+---------+
| USER_ONE |  USER_TWO |  STATUS |
+----------+-----------+---------+
|          |           |         |
| A        | B         | 0       |
|          |           |         |
| B        | A         | 1       |
|          |           |         |
| A        | C         | 1       |
|          |           |         |
| C        | A         | 1       |
|          |           |         |
| D        | A         | 1       |
|          |           |         |
| A        | E         | 0       |
+----------+-----------+---------+

我想要的结果需要如下。想象user_one 正在关注user_two,如果状态为1。状态0 意味着user_one 之前关注user_two,但现在他取消关注user_two。我需要关注“A”的用户。请注意,我不想要,它们彼此跟随的行,例如 (A -> B)(B -> A) 都具有状态 1。因此,以下响应的问题类似于,“找我关注 A 的人,但 A 没有关注他们”,有意义吗?一点帮助将不胜感激。

所需的行

+----------+-----------+---------+
| USER_ONE |  USER_TWO |  STATUS |
+----------+-----------+---------+
|          |           |         |
| B        | A         | 1       |
|          |           |         |
| D        | A         | 1       |
+----------+-----------+---------+

【问题讨论】:

提示:向sqlfiddle 提供样本数据可以增加获得(正确)答案的可能性。 @FirstOne,当然,给我几分钟 【参考方案1】:

这应该可行:

使用计数(*)

select
    t1.user_one,
    t1.user_two,
    t1.status
from
    table t1
where
    t1.status = 1 and
    -- t1.user_two = 'A' and -- If looking for people following user A in specific then uncomment this line
    (select count(t2.*)
     from table t2
     where t2.status = 1 and
           t2.user_two = t1.user_one and
           t2.user_one = t1.user_two) = 0

使用不存在

select
    t1.user_one,
    t1.user_two,
    t1.status
from
    table t1
where
    t1.status = 1 and
    -- t1.user_two = 'A' and -- If looking for people following user A in specific then uncomment this line
    not exists
        (select 1
         from table t2
         where t2.status = 1 and
               t2.user_two = t1.user_one and
               t2.user_one = t1.user_two)

【讨论】:

@ParthapratimNeog 很高兴我能帮上忙!请注意,我已经用not exists 示例更新了我的答案,因为我发现它是perform better than count(*) 完全有道理。将与not exists 一起试用看看。【参考方案2】:

您可以为此使用NOT EXISTS

SELECT USER_ONE, USER_TWO, STATUS 
FROM mytable AS t1
WHERE USER_TWO = 'A' AND STATUS = 1 AND 
      NOT EXISTS (SELECT 1
                  FROM mytable AS t2 
                  WHERE t2.USER_TWO = t1.USER_TWO AND
                        USER_ONE = 'A' AND STATUS = 1)

【讨论】:

感谢您的回答,由于某种原因,我得到了一个空的回复。我一定是把列名弄乱了,我会恢复的。

以上是关于自我加入在这里没有帮助。我还可以使用啥其他方法?的主要内容,如果未能解决你的问题,请参考以下文章

writeToFile 和 writeToURL 有啥区别?

在 Postgres 中自我加入

discord.py Spotify 似乎啥也没做

从其他类Objective-C访问方法

有啥办法可以打破 foreach 循环?

修改位图非常慢......还有其他方法吗?