2009-07-12 18 views
1

前の質問へのフォローアップでは、3つのテーブルA、B、Cがあるとしましょう。テーブルAは、テーブルBの外部キーとして使用されるIDを持っていますとC(各属性は属性として値を持ちます)。表A中の各IDのために、私は次のように行うことができ、テーブルBとCの間の値の差を取得したい:複数の計算値に基づいたMySQLのビュー

CREATE VIEW T1 AS 
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL 
    FROM B 
    GROUP BY B.A_ID; 
CREATE VIEW T2 AS 
    SELECT C.A_ID AS ID, SUM(C.VALUE) AS VAL 
    FROM C 
    GROUP BY C.A_ID; 
SELECT T1.ID, T1.VAL, T2.VAL FROM T1, T2 WHERE T1.ID = T2.ID; 

問題があれば、テーブルBは、特定のIDのためにいくつかの値を有するものです、テーブルCはそうでない、またはその逆です。その場合、私のselect文はその行を返しません。

CREATE VIEW T3 AS 
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, SUB(C.VAL) AS VAL2 
    FROM B, C 
    WHERE B.A_ID = C.A_ID 
    GROUP BY B.A_ID; 

このようなビューの作成スクリプトの例をいただければ幸いです:私は基本的に以下のようになります。これは、単一のビューを作成するための方法はあります。

+0

私は本当にあなたのために働いていたソリューションに興味があります。 –

+0

私はおそらくあなたが提案したものを使って試してみるでしょう。私は、私のスクリプトを準備しているが、解決しているデータベースへの私のユーザーアクセス権を持つ私のホスティングプロバイダに問題があるので、まだそれをテストすることができませんでした。あなたのソリューションがうまくいけば、私は正しい答えを受け入れます。 – Elie

+0

私のホスティングプロバイダはMySQL 5.0のみをサポートしており、ビューはMySQL 5.0.1で導入されていることが判明したので、データを自動的に照合するこのオプションは無効です。 – Elie

答えて

1

あなたはこの

CREATE VIEW myView AS 
SELECT test_a.id, name, IFNULL((
    SELECT SUM(value) 
    FROM test_b 
    WHERE test_b.a_id = test_a.id 
    GROUP BY test_b.a_id) , 0 
) - IFNULL((
    SELECT SUM(value) 
    FROM test_c 
    WHERE test_c.a_id = test_a.id 
    GROUP BY test_c.a_id) , 0 
) 
FROM test_a 

を使用することができますが、CはBよりも高い金額を持っている場合、これは負の数になります。

CREATE VIEW myView AS 
SELECT test_a.id, name, ABS(IFNULL((
    SELECT SUM(value) 
    FROM test_b 
    WHERE test_b.a_id = test_a.id 
    GROUP BY test_b.a_id) , 0) - IFNULL((
SELECT SUM(value) 
    FROM test_c 
    WHERE test_c.a_id = test_a.id 
    GROUP BY test_c.a_id) , 0 
) 
) 
FROM test_a 
+0

テーブルBとテーブルCの両方に、何千もの行があることを考慮すると、Aの何百もの行について、このクエリのパフォーマンスはどのようになりますか? (私は違いが正か負かを知る必要があるので、最初のオプションを使用します)また、ビューとしてこれを行う方法はありますか? – Elie

+0

ビューを作成するだけで追加する ビューの前にビュー名を表示する... パフォーマンスはわかりません...あなたはそれを試してみる必要があります...私はちょうど3つを設定する必要がありますそれぞれに数行のテーブルがあります。 もう1つの問題は、テーブルaにbまたはcのいずれにも入っていないIDがある場合です。私のクエリは0を返します。これを望まない場合は、周囲に方法があります。 –

0
SELECT ID, MAX(VAL1), MAX(VAL2) FROM 
((SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, 0 as VAL2 
FROM B GROUP BY B.A_ID) as T1 
UNION 
(SELECT C.A_ID AS ID, 0 VAL1, SUM(C.VALUE) AS VAL2 
FROM C GROUP BY C.A_ID) as T2) as Foo 
GROUP BY FOO.ID 

そのビットハック:あなたはこれを使用するよりも絶対差をつけたい場合。さらに、共用体を持つビューを作成することはできません。

関連する問題