2017-12-14 6 views
1

これは数時間見てきましたが、適切な解決策が見つかりません。私は架空のテーブルを使って私が期待していることを言って始めます。 SQLクエリを解析した後、私はこのような何かを返したい:独立したテーブルのクエリまたは複数の結合を分割します

[ 
    { 
    "storeID": 1, 
    "storeName": "best store ever", 
    "products": [ 
     { 
     "productID": 1, 
     "productName": "Name1", 
     "productPrice": 10.00 
     }, 
     { 
     "productID": 2, 
     "productName": "Name2", 
     "productPrice": 10.00 
     }, 
     { 
     "productID": 3, 
     "productName": "Name3", 
     "productPrice": 10.00 
     }, 
     ... 
    ], 
    "employees": [ 
     { 
     "employeeID": 1, 
     "employeeName": "Name1", 
     "employeeSalary": 40000.00 
     }, 
     { 
     "employeeID": 2, 
     "employeeName": "Name1", 
     "employeeSalary": 45000.00 
     }, 
     ... 
    ] 
    }, 
    ... 
] 
私の問題は、製品と従業員テーブルに格納テーブルの結合です。今、私はこれをやっている:

SELECT 
    s.storeID, 
    s.storeName, 
    p.productID, 
    p.productName, 
    p.productPrice, 
    e.employeeID, 
    e.employeeName, 
    e.employeeSalary, 
FROM stores AS s 
LEFT JOIN products AS p ON p.fk_store_id = s.storeID 
LEFT JOIN employees AS e ON e.fk_store_id = s.storeID; 

これで私はかなりのオーバーヘッドである各店舗の行x行の製品を得る。私は製品+従業員の行の数になることができる場合は、大丈夫です。しかし、それは2つの別々のクエリを実行するのと同じように思えます...製品に参加する店舗と従業員に加わる店舗の1つです。

これに対して、より適切な解決策は何でしょうか?

+0

これは2つの別々のクエリでなければなりません。製品と従業員の数が異なる可能性があるため、1つのクエリでこれを完全に行う方法はありません。列が同じであるため、UNIONを実行できます。しかしそれは技術的にも2つの質問です。 UNIONでこれを行う方法の例を見る必要があるかどうかを教えてください。 – clinomaniac

+0

私が与えた例では、列は同じであり、連合は機能しますが、実際の問題では列が同じではないということは真実です。したがって、UNIONは機能しません。そして、UNIONを行うときに2つのテーブルを区別することが不可能にならないのですか? – fcarle

+0

データの種類を示す別の列を追加できます。列はstoreId、storeName、タイプ(従業員/製品)、ID、名前、価格/給与となります。 – clinomaniac

答えて

1

ここで試している結合のタイプは、LEFT結合の適切な場合ではありません。 3つのテーブルA、B、Cの間で結合を行うと、テーブルAとテーブルBが最初に結合し、次にこの結合の結果でテーブルCが結合されます。したがって、表Bと表Cの両方に表Aのすべての行にデータが接続されている場合、行の合計数はn(A)* n(B)* n(C)になります。

希望の出力を得るには、2つのクエリが必要です。または、1つのクエリを作成し、フロントエンドスクリプトを使用して結果を希望の出力に変換することもできます。

+0

それは私が答えとして見ていたものです。私は誰かが私のためにそれを確認したことをうれしく思います。 – fcarle

+0

私のupvoteは今のところ表示されないので、評判が15以下です – fcarle

0

これは私がUNIONを使用したことです。タイプの列を見て、次のレイヤーでそれを処理する方法を理解するためには、いくつかの操作が必要になります。

SELECT 
    s.storeID, 
    s.storeName, 
    'Employee' AS type, 
    e.employeeID AS id, 
    e.employeeName AS name, 
    e.employeeSalary AS cost 
FROM stores AS s 
LEFT JOIN employees AS e ON e.fk_store_id = s.storeID 
UNION 
SELECT 
    s.storeID, 
    s.storeName, 
    'Product' AS type, 
    p.productID, 
    p.productName, 
    p.productPrice 
FROM stores AS s 
LEFT JOIN products AS p ON p.fk_store_id = s.storeID; 

そこにあなたが店に参加しますので、製品と従業員の間には直接の関係はありません、それはあなたの従業員が参加し、製品Xを与えるので、参加を使用して単一のクエリを行うことはできません。

関連する問題