gpt4 book ai didi

python - X 的关注者,不包括单个 JOIN 查询中 Y 的关注者(多对多直通)

转载 作者:行者123 更新时间:2023-11-29 08:49:14 24 4
gpt4 key购买 nike

我的问题的答案很可能是“这就是你能做的最好的事情”,但我希望我只是看得太久而错过了一些东西......

引用此article on Asymmetrical Relationships ,我正在查看“共同好友关系”查询。以下是文章中的模型:

class Person(models.Model):
name = models.CharField(max_length=100)
relationships = models.ManyToManyField('self', through='Relationship',
symmetrical=False,
related_name='related_to')

def get_friends(self):
return self.relationships.filter(
to_people__from_person=self,
from_people__to_person=self)

class Relationship(models.Model):
from_person = models.ForeignKey(Person, related_name='from_people')
to_person = models.ForeignKey(Person, related_name='to_people')

get_friends() 产生 JOIN 查询。

我想做的查询是“关注 person_A 但不关注 person_B 的人”。多对多的关系消除了一堆工作,只留下我的一个简单的查询要求......所以我有这个:

person_A.relationships\
.filter(from_people__to_person=person_A)\
.exclude(from_people__to_person=person_B)

结果包含一个子查询:

SELECT `person`.`id` FROM `person` 
INNER JOIN `relationship` ON (`person`.`id` = `relationship`.`to_person_id`)
INNER JOIN `relationship` T4 ON (`person`.`id` = T4.`from_person_id`)
WHERE (
`relationship`.`from_person_id` = 178
AND T4.`to_person_id` = 178
AND NOT (`person`.`id` IN (
SELECT U1.`from_person_id` FROM `relationship` U1
WHERE (U1.`to_person_id` = 191 AND U1.`from_person_id` IS NOT NULL)
))
)

这种排除查询是否意味着需要子查询,或者我只是错过了一些简单的调整?

最佳答案

假设您的表格(可能是简化的)看起来类似于:

人:

id   |   name
-------------
1 | Zane
2 | Jeff
3 | Troy
5 | Steffan
6 | Lolo
7 | Katrina
<小时/>

关系:

from_id   |   to_id
-------------------
1 | 5
1 | 6
2 | 5
2 | 1
2 | 5
3 | 1
5 | 1
5 | 2
7 | 5

其中 from_idto_id 的关注者,并且一个人不能关注他或她自己。

我们希望获得 5 的所有关注者,但同时又不是 1 的关注者,我们希望得到这样的结果:

id   |   name
--------------
1 | Zane
7 | Katrina

您可以使用此解决方案:

SELECT    a.id, a.name
FROM person a
JOIN relationship b ON a.id = b.from_id
LEFT JOIN (
SELECT from_id
FROM relationship
WHERE to_id = 1
) c ON b.from_id = c.from_id
WHERE b.to_id = 5 AND
c.from_id IS NULL
<小时/>

SQLFiddle Demo

关于python - X 的关注者,不包括单个 JOIN 查询中 Y 的关注者(多对多直通),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com