2012-04-09 11 views
2

LEFT JOINの喜びに世界で最も新しい変換です。以下は、美しく働いている:XでAとBを左に結合し、YでBとCを結合する

$STH = $DBH->prepare(" 
SELECT cc.cat_subject, cc.cat_major, cc.cat_minor, cc.cat_name, c.cnum, c.unmod 
    FROM comment_category cc 
LEFT JOIN comment c 
    ON cc.cat_subject = c.cat_subject AND cc.cat_major = c.cat_major AND cc.cat_minor = c.cat_minor 
ORDER BY cc.cat_subject, cc.cat_major, cc.cat_minor"); 

私は今、何をしたいのか、しかし、参照のみcomment (c)comment_category (cc)となしと共通のフィールドcnumを持つ別のテーブルfavourite (f)です。

私は次のことを試してみました:

$STH = $DBH->prepare(" 
SELECT cc.cat_subject, cc.cat_major, cc.cat_minor, cc.cat_name, c.cnum, c.unmod, f.favourite 
FROM comment_category cc 
LEFT JOIN comment c 
    ON cc.cat_subject=c.cat_subject AND cc.cat_major=c.cat_major AND cc.cat_minor=c.cat_minor 
LEFT JOIN favourite f 
    ON c.cnum=f.cnum 
ORDER BY cc.cat_subject, cc.cat_major, cc.cat_minor"); 

それは動作しません。私はcomment (c)ではなく、comment_category (cc)への別の結合を実際に要求しているからです。

要約:AからLEFT JOINをBに選択するにはどうすればよいですか?Bのフィールドを使用してCの値にアクセスしますか? (不快感をパンターによる)

UPDATE:

テーブルは以下のとおりです。

comment_category 
---------------- 
subject (int) 
cat_major (int) 
cat_minor (int) 
name  (varchar) 

comment 
------- 
cnum  (int) 
subject (int) 
cat_major (int) 
cat_minor (int) 
unmod  (varchar) 

favourite 
--------- 
cnum  (int) 

...私はここに停止されます - お気に入りのフィールドがfavourite表にありませんので、それがクラッシュします。

私の間違い。申し訳ありません、すべて。

+1

あなたは次のようなものを探していますか?B.b = A.aのLEFT JOIN BでC.c = B.somethingのLEFT JOIN Cを選択します。あなたのSQLは有効に見えます。あなたはどんなエラーを出していますか? – Corbin

+3

「それはうまくいかない」ってどういう意味ですか?エラー?返される行はありませんか? –

+0

申し訳ありません。返される行はありません。私は質問を更新します。 – Nick

答えて

1

あなたはこれを自分で考え出しました。あなたがJOINを初めて使うと言うので、2つ以上のテーブルを一緒にジョインするときはいつでも、それを追加したいと思っていました。INNER JOINの使用を検討することをお勧めします。違いは、LEFT JOINは、コメントに一致するかどうかにかかわらず、LEFT(この場合はcomment_category)の行を返します。 INNER JOINは、comment_categoryからの行を返さず、コメント内に一致する場合を除きます。

このシナリオではこれが重要な理由は、お気に入りのJOINがNULL以外のものを返すために、クエリでは最初にcomment_categoryの行を照合する必要があるからです。 comment_categoryとcommentにINNER JOINを使用すると、トラブルシューティングのあいまいさが軽減されます。また、INNER JOINを使用すると、結果からNULL値が除外されます(JOINの不一致によるNULL)。

LEFT対INNER JOINの使用は、ビジネス要件によっても異なります。たとえば、comment_category内のすべての行がの場合はに一致するコメントが必要な場合は、INNER JOINを使用する必要があります。しかし、必ずしもお気に入りを持っていなくてもよいコメントを照会している場合(ただし、あれば返されるようにする)、LEFT JOINを使用する必要があります。お役に立てれば。

+0

ありがとうございます。私はそれを忘れています。 – Nick

関連する問題