2

テーブルから製品を選択するクエリがあります。商品には、複数の価格 (さまざまな価格を考えてください) とデフォルトの価格を設定できます。

当然、これは一対多の関係です。特定の価格またはデフォルト価格 (相互排除を意味する) を持つ製品を選択する必要があります。これは、個別のクエリと WHERE (not) IN 句または union ステートメントを使用して実行できることはわかっていますが、より最適な方法が可能であるに違いないと確信しています。私のクエリは現在次のようになっています。

SELECT products.*, products_prices.price 
FROM products RIGHT JOIN 
     products_prices ON (products.id = products_prices.productId) 
WHERE products_prices.businessId = ? 
OR    products_prices.businessId IS NULL // this needs to become mutual.

編集:このクエリを使用することになりました。これは、Gordon Linoff のわずかに変更されたバージョンです。

 SELECT distinct p.*, coalesce(pp.price, defpp.price)
 FROM products p LEFT JOIN 
      products_prices pp
      ON p.id = pp.productId and pp.businessId = ? left join
      products_prices defpp
      on p.id = defpp.productId and defpp.businessId is NULL
4

1 に答える 1

7

あなたの質問を正しく理解できれば、productsテーブルにはデフォルトの価格が表示され、product_pricesテーブルにはその他の価格が表示されます。

デフォルトの価格がどこで使用されているか、つまり他の価格がないことを知りたいとします。これには、次を使用しますleft outer join

SELECT p.*, coalesce(pp.price, p.default_price)
FROM products p LEFT OUTER JOIN 
     products_prices pp
     ON p.id = pp.productId
WHERE pp.price = GIVENPRICE or pp.price is null

あなたのコメントに基づいて、ビジネス ID が NULL のレコードにデフォルトの価格を保存しています。この場合、価格テーブルに 2 つの結合を行います。

SELECT p.*, coalesce(pp.price, defpp.price)
FROM products p LEFT OUTER JOIN 
     products_prices pp
     ON p.id = pp.productId and pp.price = GIVENPRICE left outer join
     products_prices defpp
     on p.id = defpp.productId and defpp.businessId is NULL

最初の結合は、指定された価格に一致する価格を取得します。2 番目はデフォルト価格を取得します。存在する場合は最初の結果が使用され、存在しない場合は 2 番目の結果が使用されます。

于 2013-03-20T14:21:38.367 に答える