2012-03-08 6 views
1

ギャラリーに画像を関連付ける3つのテーブルを含むmySQLデータベースがあります。画像はテーブル「ファイル」とギャラリー「ギャラリー」のギャラリーに格納されるため、それらの間の関連付けに「ギャラリー_ファイル」という中間テーブルを使用します。 "gallery_files"テーブルは、それぞれメインテーブルの2つのID(F_ID、G_ID)で構成されています。同じクエリでmySQL double filtering

ファイル/イメージは複数のギャラリーに関連付けることができるため、異なるG_IDに対して同じF_IDのレコードが「gallery_files」に存在する可能性があります。

ここでは、指定されたギャラリーに関連付けられていないすべてのイメージを表示するmySQLクエリを作成します。だから私は、次のクエリを使用します。

(のは、IDとギャラリーのために言わせて:9)

SELECT * FROM files 
INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID 
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 
    AND gallery_files.G_ID <> 9 

私の問題は、異なるギャラリーに関連した画像の記録がある場合、それはまだそれをもたらすということです。私はなぜこれが起こるのか知っていますが、仕事をするためのスマートなクエリは考えられません。私は2つのクエリを使用してこれを解決する方法を知っていますが、可能であれば、それを避けたいと思います。

どのような考えですか?

答えて

1

は、あなたが内部に一致しないこれらの行を選択する外部結合を使用し、のみにNULL列を確認することができます参加:

そうでない場合 ON句にG_ID条件を置くことによって
SELECT * FROM files 
LEFT JOIN gallery_files ON files.F_ID=gallery_files.F_ID AND gallery_files.G_ID = 9 
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 
    AND gallery_files.G_ID IS NULL 

JOINは(それは外なのでジョイン)gallery_filesテーブルから、それが存在する場合、またはヌルにそのギャラリー9行に各ファイルを結合します。その後

、gallery_filesカラム(私はG_IDをチェックしますが、任意の列が働いているだろう)にNULLをチェックすることによって、我々は唯一のがないギャラリーの

+0

9はどうもありがとうございましたfilesからこれらの行を取得します。それは働いた! :) –

0

私はNOT INステートメントがあなたが望むことをするべきだと信じています。線に沿って

何か:サブクエリなし

SELECT * 
FROM files 
WHERE files.F_ID NOT IN 
    (SELECT files.F_ID 
    FROM files 
    INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID 
    WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 AND gallery_files.G_ID = 9) 
関連する問題