2012-05-10 5 views
1

これにはすでに4つのINNER JOINとLEFT JOINが含まれていますが、LEFT JOINテーブルと同様のテーブルをもう1つ参照する方法がわかりません。1つのクエリで2つの特定のテーブルを参照することが可能

は、ここでは、だから、基本的に各製品はクラスとバリアントの両方を持っている

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path, count(xvi.variantid) as cnt 
    FROM xcart_products xp 
    INNER JOIN xcart_variants xv ON xp.productid = xv.productid 
    INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid 
    INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid 
    INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR' 
    LEFT JOIN xcart_images_W xiW ON xiW.id = xvi.variantid 
    GROUP BY xco.optionid 
    ORDER by xp.product DESC 

に想定されるように動作し、私の現在のクエリで、その後、各クラスは、クラスのオプションがあり、各バリアントは、バリアントの項目があります。バリアントには独自のバリアント画像があり、各クラスには独自の「詳細」画像(xcart_images_D)があります。現時点では、私はバリアント画像を参照していますが、xvi.variantidを数えるのではなく、何をしたいのですか。私はoptionidごとにどれだけ多くの詳細画像があるかをカウントしたいと思います。

私はこれを行うクエリを持っていますが、残念ながらxcart_images_Wを引き出すためにこのクエリを使用することはできません。そのクエリはベロ

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiD.image_path, xiD.path_on_server, count(xiD.optionid) as cnt 
    FROM xcart_products xp 
    INNER JOIN xcart_classes xc ON xp.productid = xc.productid AND xc.class = 'Color' 
    INNER JOIN xcart_class_options xco ON xc.classid = xco.classid 
    LEFT JOIN xcart_images_D xiD ON xiD.optionid = xco.optionid 
    GROUP BY xp.product, xco.optionid 
    ORDER by xp.product DESC 

が、それはこれらの2つのテーブルを参照するか、その外部キーはそれは不可能そうするように作るのですかすることは可能ですか?

以下、私はテーブル構造を提供しました。

+ xcart_products 
    - productid* 
    - product 
+ xcart_variants 
    - variantid* 
    - productid (xcart_products.productid) 
+ xcart_variant_items [bridge table] 
    - optionid* 
    - variantid (xcart_variants.variantid) 
+ xcart_classes 
    - classid* 
    - productid (xcart_products.productid) 
    - class 
+ xcart_class_options 
    - optionid* 
    - option_name 
    - classid (xcart_classes.classid) 
+ xcart_images_W 
    - imageid* 
    - id (xcart_variants.variantid) 
    - image_path 
+ xcart_images_D 
    - imageid* [not relational with xcart_images_W.imageid] 
    - id (xcart_products.productid) 
    - optionid (xcart_class_options.optionid) 
    - image_path 

* Primary Key 
() relational data 
[] notes 

現在作業中です。どのように私はきれいにするのですか?

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path 
FROM xcart_products xp 
INNER JOIN xcart_variants xv ON xp.productid = xv.productid 
INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid 
INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid 
INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR' 
LEFT JOIN xcart_images_W xiW ON xiW.id = xvi.variantid 
LEFT JOIN (
SELECT COUNT(xiD.optionid) as dCount 
    FROM xcart_products xp2 
    INNER JOIN xcart_classes xc2 ON xp2.productid = xc2.productid AND xc2.class = 'Color' 
    INNER JOIN xcart_class_options xco2 ON xc2.classid = xco2.classid 
    LEFT JOIN xcart_images_D xiD ON xiD.optionid = xco2.optionid 
) ON xiW.id = xvi.variantid 
GROUP BY xco.optionid 
ORDER by xp.product DESC 

答えて

1

テーブル定義を提供するまでは完全ではありません。最初のクエリでcount(xvi.variantid)をcount(xiW.id)に置き換えてみましたか?

更新:

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path, count(xvi.variantid) as cnt 
FROM xcart_products xp 
INNER JOIN xcart_variants xv ON xp.productid = xv.productid 
INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid 
INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid 
INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR' 
LEFT JOIN (
    SELECT COUNT(xiD.id) as Dcount 
    FROM xcart_images_D xiD 
    INNER JOIN xcart_images_W xiW ON xiW.column = xiD.column /*please update accordingly */ 
) ON xiW.id = xvi.variantid 
GROUP BY xco.optionid 
ORDER by xp.product DESC 

再び更新:

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path, count(xvi.variantid) as cnt, xiD.totalD 
FROM xcart_products xp 
INNER JOIN xcart_variants xv ON xp.productid = xv.productid 
INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid 
INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid 
INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR' 
LEFT JOIN (
    SELECT count(xiD.id) as totalD, xiD.optionid FROM xcart_images_D xiD WHERE xiD.optionid = xvi.optionid 
) ON xiD.optionid = xvi.optionid 
GROUP BY xco.optionid 
ORDER by xp.product DESC 
+0

こんにちはJA支援をいただき、ありがとうございます。私はテーブルのレイアウトを提供しますが、あなたの提案を先に試してみましたが、問題はそれぞれのxiWにはそれ自身のイメージセットがあり、xiDもそうです。私がxiWと数えると、バリアント画像の数がカウントされ、私が探しているのはバリアント画像ではなく詳細画像の数です。 – Eric

+1

xiWとxiDテーブル定義を提供してください。また、上記のクエリを実行すると(読みやすさのために私のポストを更新しています)? –

+0

確かにJA、私は先に進み、元の投稿の参照先テーブルの重要な情報を追加しました。 – Eric

関連する問題