[英]sqlalchemy many-to-many relationship (tag system)
我有三個表: file
, file_tag
和tag
。
現在,我想查找所有具有ID為1
和3
的標簽的文件。
class File_Tag(Base):
__tablename__ = 'file_tag'
id = Column(Integer, primary_key=True)
file_id = Column('file_id', Integer, ForeignKey('file.id'))
tag_id = Column('tag_id', Integer, ForeignKey('tag.id'))
class File(Base):
__tablename__ = 'file'
id = Column(Integer, primary_key=True)
name = Column(String(255))
tags = relationship('File_Tag')
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True)
name = Column(String(255))
files = relationship('File_Tag')
這就是我所擁有的:
session.query(File).join(File.tags).filter(File_Tag.tag_id.in_([1, 3]))
問題是它向我顯示了帶有標簽1
或3
所有文件,我想查看帶有標簽1
和3
所有文件。
它產生的SQL查詢如下所示:
SELECT file.id AS file_id,
file.name AS file_name,
file.sha1 AS file_sha1,
file.import_id AS file_import_id
FROM file
INNER JOIN file_tag
ON file.id = file_tag.file_id
WHERE file_tag.tag_id IN (1, 3)
GROUP BY file.id
至於結果我得到的文件2
, 3
和4
,但我應該得到的只是文件2
和4
。
我不想在可能的情況下使用子查詢,聽說它們很慢;)
請嘗試以下方法:
SELECT file.id AS file_id,
file.name AS file_name,
file.sha1 AS file_sha1,
file.import_id AS file_import_id
FROM file
INNER JOIN file_tag
ON file.id = file_tag.file_id
WHERE file_tag.tag_id =1
AND file_tag.file_id IN
(SELECT file_id FROM file_tag WHERE tag_id=3
)
GROUP BY file.id;
另外,sqlalchemy應該類似於:
subq=session.query(File_Tag).filter(File_Tag.tag_id=3);
session.query(File).join(File.tags).filter((File_Tag.tag_id=1)&(File_Tag.file_id.in(subq)))
它包含一個子查詢,但我認為這是不可能實現你想要什么,而無需使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.