3

実行MySQL 5.0.88していて、 と という 2 つのテーブルからデータを選択する必要がありarticlesますmedia

type="img"画像をサーバーにアップロードするとき、不要な上書きを避けるために、ユーザーのすべての記事を照会し、メディア テーブル (フィールド ) にパスが既に指定されているかどうかを確認する必要があります。

クエリにを含めることだけを望んでいましたが、m.type機能させることができません。

私のクエリは次のようになります。

SELECT DISTINCT a.style, a.filename, a.path, m.type
    FROM articles AS a
    LEFT JOIN mnedia AS m
       ON a.iln = m.iln
    WHERE
       a.iln = id_12345
       AND m.type = "img"
       AND m.type IS NOT NULL

これにより、ユーザーid_12345のすべての記事(正しい)が得られますが、メディアテーブルには article のレコードが1つしかありませんが、typeフィールドは常にです。imgabc

質問:テーブルにリストされていない記事と、テーブルにリストされている記事( など
) を表示しているユーザー (作業中) のすべての記事を返すには、どのように照会する必要がありますか?type=NULLmediatype="img"mediaabc

手伝ってくれてありがとう!

EDIT : テーブルarticlesにはレコードが含まれる場合があります:

abc 
d
e
f
g

テーブルには次のmediaものが含まれる場合があります

abc type=img

クエリは次を返す必要があります。

abc type=img
d type=NULL
e type=NULL
f type=NULL
g type=NULL

EDIT :この画像のように、 にない
すべてのレコードを取得してもかまいません。2番目の結合の左側 ("b.Key IS NULL)articlesmedia

解決策: わかりました。両方のテーブルを結合するときに、user_id 以外の別のフィールドを確認する必要がありました。これがどのように機能するかです:

SELECT DISTINCT a.style, a.filename, a.path, m.type
    FROM articles AS a
    LEFT JOIN mnedia AS m
       ON a.iln = m.iln
       AND a.style= m.style
    WHERE
       a.iln = id_12345
       AND ( m.type = "img" OR m.type IS NULL )

あなたの提案に感謝します!

4

2 に答える 2

2

句に入れるのではなく、m.type = "img"条件を付ける必要があります。LEFT JOINWHERE

SELECT DISTINCT a.style, a.filename, a.path, m.type
FROM articles AS a
     LEFT JOIN mnedia AS m
         ON a.iln = m.iln
            AND m.type = "img"
WHERE a.iln = id_12345;
于 2012-08-16T09:25:29.160 に答える
1

where句を少し調整するだけで十分だと思います:

WHERE
       a.iln = id_12345
       AND (
              m.type = "img"
              OR m.type IS NULL
           )

「img」と NULL が探している 2 つの値であるため

于 2012-08-16T09:25:07.210 に答える