自我加入在这里没有帮助。我还可以使用啥其他方法?
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)
【讨论】:
感谢您的回答,由于某种原因,我得到了一个空的回复。我一定是把列名弄乱了,我会恢复的。以上是关于自我加入在这里没有帮助。我还可以使用啥其他方法?的主要内容,如果未能解决你的问题,请参考以下文章