2014-05-15 41 views
1

我有三個表格:file,file_tagtag
現在我想查找所有標籤ID爲13的文件。sqlalchemy多對多的關係(標籤系統)

Table: file Table: file_tag Table: tag

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 OR 3,我想看到所有文件標籤13

的SQL querys它產生看起來是這樣的:

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 

至於結果我得到的文件234,但我應該得到的只是文件24

我不想盡可能使用subquerys,我聽說他們是緩慢的;)

回答

0

請試試這個:

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))) 

它包含一個子查詢,但我認爲不可能在不使用它們的情況下實現你想要的。

+0

這是工作,但我需要sqlalchemy代碼,請! – fnkr

+0

另外,我從來沒有使用過sqlalchemy,我試圖爲你製作正確的。請參閱編輯。 – Guneli

+0

我認爲每個標籤1個子查詢是可以的,但是如果我有一個標籤的list()標籤(從0到x標籤),你能告訴我自動化嗎?例如:'searled_tags = list(1,3,10,15,...)'。 – fnkr