次のように読みやすい結果セットが得られる、信じられないほど複雑な SQL クエリ (3 つの INNER JOINS) があります (簡略化)。データベースを継承したため、既存のテーブルの構造を変更することは不可能であるため、複雑なクエリを実行してこの時点に到達する必要があります。
product_category | product_code
------------------------------------
Hardware 102
Hardware 104
Hardware 102
Software 205
Software 104
次に、単純にGROUP BYproduct_category、product_code を実行すると、関心のある最終的な結果セットのほとんどが得られます。
product_category | product_code
------------------------------------
Hardware 102
Hardware 104
Software 205
Software 104
ただし、不足しているのは在庫数です。
product_category | product_code | num_in_stock
--------------------------------------------------------
Hardware 102 2
Hardware 104 1
Software 205 1
Software 104 1
COUNT()ステートメントで行われる処理から直接できるようにしたいのでGROUP BY、少し迷っています。
これまでの SQL クエリは次のとおりです。
SELECT categories.product_category, codes.product_code FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code
表は次のとおりです。
CATEGORIES- 例: 「ハードウェア」、「ソフトウェア」CODES- 例: 100、204 (に属するcategory)PRODUCTS-categories+の組み合わせcodes、役に立たないバージョン #STOCK・商品のエントリー、在庫が複数ある場合は複数エントリーあり
これが非常に厄介なのは、 の役に立たないversion #フィールドが原因ですPRODUCTS。これが意味することは、特定の組み合わせ (例: "Hardware 102")PRODUCTSに対して、それぞれ異なるversion #値で複数回入力できることです。これにより、同じ製品であるにもかかわらず、異なるものSTOCKを参照することになります。 . うーん!idsPRODUCTS
何か案は?
編集:
たとえば、2 つの異なるバージョンを持つ製品「Misc 999」があるとします。これはCATEGORIES、"Misc"のエントリ、 CODES"999"のエントリ ( category_id"Misc" に属するもの)、および 2 つのエントリPRODUCTS(両方とも同じcode_idであるが異なるversion情報を持つ - 私は無視しています) があることを意味します。 .
次に、これらの在庫が 10 個ある場合 (一方のバージョンが 3 個、もう一方のバージョンが 7 個ですが、バージョン情報は無視します)、STOCKテーブルには 10 個のエントリがあり、それぞれがPRODUCTS( id2 つのこの場合は異なる ID)。