1

簡単にするために、私が達成しようとしていることの簡単な例を示します。

表 1 - メンバー

  ID    |   Name
--------------------
  1     |   John    
  2     |   Mike    
  3     |   Sam  


表 1 - Member_Selections

  ID    |   planID
--------------------
  1     |   1    
  1     |   2    
  1     |   1    
  2     |   2    
  2     |   3    
  3     |   2    
  3     |   1    


表 3 - Selection_Details

planID  |   Cost
--------------------
  1     |   5    
  2     |   10    
  3     |   12  

クエリを実行すると、メンバーごとにグループ化されたすべてのメンバー選択の合計が返されます。しかし、私が直面している問題 (例: 表 2 のデータ) は、一部のメンバーがシステム内で誤って重複した情報を持っている可能性があることです。このデータを前もってフィルタリングするために最善を尽くしますが、時々、情報を引き出すためにシステムに必要な呼び出しを行うときに、このデータをフィルタリングしたいと考えています。

結果は以下を示すべきです:

結果表

ID  |    Name    | Total_Cost
-----------------------------
1   |    John    |   15
2   |    Mike    |   22
3   |    Sam     |   15

しかし、誤ってプラン ID #1 を 2 回挿入したため、John を $20 とします。

私のクエリは現在:

SELECT
    sq.ID, sq.name, SUM(sq.premium) AS total_cost
FROM
(
    SELECT
    m.id, m.name, g.premium
    FROM members m
    INNER JOIN member_selections s USING(ID)
    INNER JOIN selection_details g USING(planid)
) sq group by sq.agent

DISTINCT s.planID を追加すると、(メンバー 1 と 3 が購入したにもかかわらず) 販売された PlanID 1 が 1 つしか表示されないため、結果が正しくフィルター処理されません。

どんな助けでも大歓迎です。

編集

また、エージェント テーブル (プランをメンバーに販売したエージェント) について言及するのを忘れていた別のテーブルもあります。

最後の group by ステートメントは、エージェント ID によって販売されたすべての商品をグループ化します (これにより、最終結果が 1 行になります)。

4

4 に答える 4

2

おそらく最も簡単な解決策は、member_selectionsテーブルに一意の複合キーを配置することです。

 alter table member_selections add unique key ms_key (ID, planID);

これにより、ID/planIDの一意の組み合わせがテーブルの他の場所にすでに存在する場合にレコードが追加されるのを防ぐことができます。それは単一の(1,1)のみを許可します

コメントフォローアップ:

「alterignore...」についてのコメントを見たところです。それは問題なく動作しますが、それでもテーブルに悪い重複が残っています。一意のキーを実行してから、手動でテーブルをクリーンアップすることをお勧めします。コメントに入力したクエリで、重複しているものがすべて見つかるはずです。これを手作業で取り除くことができます。テーブルがクリーンになると、クエリの重複処理バージョンは必要なくなります。

于 2011-01-11T21:00:07.557 に答える
0

group by句を内部クエリに追加できます。このクエリは、3つの列すべてでグループ化され、基本的に一意の行のみを返します。(サンプルテーブルに一致するように「premium」を「cost」に変更し、エージェント部分を削除しました)

SELECT
    sq.ID, 
    sq.name, 
    SUM(sq.Cost) AS total_cost
FROM
(
    SELECT
            m.id, 
            m.name, 
            g.Cost
    FROM 
            members m
            INNER JOIN member_selections s USING(ID) 
            INNER JOIN selection_details g USING(planid)

        GROUP BY
            m.ID,
            m.NAME,
            g.Cost
) sq 
group by 
    sq.ID,
    sq.NAME
于 2011-01-11T22:29:56.253 に答える
0

誤って重複するエントリを防ぐには、UNIQUEキーを使用します。これにより、症状が現れ始めたときではなく、ソースでの問題が解消されます。また、一貫性のあるデータベースを使用できるため、後のクエリが簡単になります。

于 2011-01-11T21:01:03.857 に答える
0

どうですか:

SELECT
    sq.ID, sq.name, SUM(sq.premium) AS total_cost
FROM
(
    SELECT
    m.id, m.name, g.premium
    FROM members m
    INNER JOIN 
         (select distinct ID, PlanID from member_selections) s
    USING(ID)
    INNER JOIN selection_details g USING(planid)
) sq group by sq.agent

ちなみに、そもそもこれらの重複が発生しないようにするmember_selectionsの主キーがない理由はありますか?

于 2011-01-11T21:02:51.337 に答える