SqlAlchemy:过滤以匹配列表中的所有值而不是任何值?

boa*_*tor 7 python mysql sql sqlalchemy

我想查询一个结表列的值aID匹配ID列表的所有值ids=[3,5]bID.

这是我的联结表(JT):

 aID    bID
   1      1
   1      2
   2      5
   2      3
   1      3
   3      5
Run Code Online (Sandbox Code Playgroud)

我有这个问题: session.query(JT.aID).filter(JT.bID.in_(ids)).all()

该查询返回的aID1,2并且3因为它们都与行的任一35bID列.我希望查询返回的是2因为这是唯一aID具有列中ids列表的所有值的值bID.

不知道如何更好地解释问题,但我怎样才能得到结果?

bvi*_*dal 9

基于@Gordon Linoff的回答和两个表A,B其中A有一对多的关系B称为A.bsSqlAlchemy等价物将是:

from sqlalchemy import func  
session.query(A).join(B).filter(B.id.in_(<your_list>)).group_by(A.id).having(func.count(A.bs) == len(<your_list>)).all()
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

您正在寻找适用于行集的查询。我认为一个 group by with 子句是最好的方法:

select aid
from jt
where bid in (<your list>)
group by aid
having count(distinct bid) = 2
Run Code Online (Sandbox Code Playgroud)

如果您可以将所需的 id 放入表中,则可以执行以下更通用的方法:

select aid
from jt join
     bids
     on jf.bid = bids.bid
group by aid
having count(distinct jt.bid) = (select count(*) from bids)
Run Code Online (Sandbox Code Playgroud)