2016-10-11 16 views
0

タイトルはどうなるべきかは分かりませんが、できるだけ明確に説明しようとします。テーブル内のすべての行の和集合

私はさまざまな種類の食品を含むオンラインの食品ポータルを持っています。食品に応じて、私はさまざまな食べ物のさまざまな属性を特徴づけます。 わかりやすくするために、私はケーキを販売していると仮定します。ケーキは、以下の属性を持つことができます。つまり、重量を持ち、重量によって価格が異なります。

同様に、ラップには2つの属性があり、大きくて小さくすることができます。

base_product_table 
     ID | product_code | product name | company_id 
     1 | 12345  | beer cake |343434defee 
     2 | 12346  | vodka cake |343434deereee 
     3 | 123451  | cheese wrap |wqeqwewwe 
     4 | 123453  | nb wrap  |weqwew 
     5 | 123464  | ad wrap  | adwadw 

cake_table 
      Product_code |Quantity | price | weight 
      12345  | 34  |345 |0.5 
      12345  | 343 |600 |1.0 
      12345  | 4  |845 |1.5 
      12346  | 341 |345 |0.5 

wraps_table 
      Product_code |Quantity | price | size 
      123451   | 34  |345 |s 
      123451   | 343 |600 |l 
      123453   | 4  |845 |s 
      123464   | 341 |345 |s 

これらは私の3つのテーブルです.1つはベーステーブルで、もう1つはベーステーブルと結合して目的のテーブルを得ることができます。

私の製品ページにすべての製品を表示する必要がある場合、この方法の実際の問題が発生します。select * from base_product_tableを単純に行うことができましたが、商品の重量またはサイズを表示する必要があります。

enter image description here 上記の画像は、商品ページに商品を表示したことを示しています。

解決方法はありますか?

更新:ケーキテーブルで iがケーキを持っているが、3つの異なる量の出力は重量が最小の重量とその最小重量の価格であると、そのそれぞれのケーキのための唯一のものであるべきです。

同様に、ラップは小さいサイズと大きいサイズの2つのサイズを持ちますが、出力は小さいレコード価格のラップでは1つだけになります。

+0

他の二つのテーブルの組合と基本製品のテーブルを結合する、またはそれに参加他のテーブルのそれぞれと結合してそれらの和集合を作成します。 – Barmar

+0

答えを書いてください。私はそれを感謝します。 @Barmar –

+0

私は問題を参照して、あなたは一度だけ製品を表示したいが、利用可能なサイズに応じて、1つ以上の価格があるかもしれない、正しい? –

答えて

1

このSQLは、価格が最小(重量)であることを前提として、ケーキの価格を返します。

SELECT pt.product_name, 
     pt.company_id, 
     (SELECT MIN (price) 
      FROM cake_table ct 
     WHERE  ct.product_code = pt.product_code 
       AND ct.weight = (SELECT MIN (sub.weight) 
            FROM cake_table sub 
           WHERE sub.product_code = ct.product_code)) 
      cake_price 
    FROM base_product_table pt 

これが動作する場合などpreviosly提案よりも、それだけで2つのテーブルを結合の問題です:どちらか一方

((SELECT pt.product_name, 
      pt.company_id, 
      (SELECT MIN (price) 
      FROM cake_table ct 
      WHERE  ct.product_code = pt.product_code 
        AND ct.weight = (SELECT MIN (sub.weight) 
            FROM cake_table sub 
            WHERE sub.product_code = ct.product_code)) 
       cake_price 
    FROM base_product_table pt 
    WHERE EXISTS 
       (SELECT 'X' 
       FROM cake_table ck 
       WHERE ck.product_code = pt.product_code)) 
UNION ALL 
(SELECT pt.product_name, 
     pt.company_id, 
     (SELECT MIN (price) 
      FROM wraps_table ct 
      WHERE  ct.product_code = pt.product_code 
       AND ct.weight = (SELECT MIN (sub.weight) 
            FROM wraps_table sub 
            WHERE sub.product_code = ct.product_code)) 
      cake_price 
    FROM base_product_table pt 
    WHERE EXISTS 
      (SELECT 'X' 
       FROM wraps_table ck 
       WHERE ck.product_code = pt.product_code))) 
+0

助けてくれてありがとう、私はそれを感謝します –

+1

これはあなたが探していたものですか?また、半予想の結果を返しますか?私はDBデザインがちょっと奇妙だと思っていますが、私は商品の表にラップ/ケーキなどをつけてアイテムの属性として...あなたの数量を表す手持ちの数量表を持つことができます。原価計算。タイプごとにテーブルを用意することはあまりうまくいかないDBデザイン:( –

+0

Robertoあなたのデザインは何ですか?もう少し説明できますか?私はそのデザインを使うことができます。このデザインも好きではありません。 –

1

次のような出力が必要な場合は、 weightとsizeの両方が同じデータ型であると仮定すると、そうでない場合、両方の共用体の結果から同じ日付型を返すためにキャストを使用します。

select product_name,price,weight as custom 
from base_product_table bpt join cake_table ct on bpt.product_code = ct.product_code where weight = (select min(weight) from cake_table ct2 where ct.product_code = ct2.product_code) 
union all 
select product_name,price, size as custom 
from base_product_table bp join wrap_table wt on bp.product_code = wt.product_code where size = (select min(size) from wrap_table w2 where wt.product_code = w2.product_code); 
+0

サイズのカスタム列が空になりますか?彼らは異なった種類のものであるかもしれませんか? –

+0

それは可能性があります。クエリを変更して型変換して一般的な型に変換してください。他の列は正しく挿入されていますか? –

+0

助けてくれてありがとう、私はそれを感謝します。はい、私はこれを行う方法の公正なアイデアを持っています。 –

関連する問題