2011-03-11 5 views
0

私は、次のテーブル構造(簡易版)を持っているMySQLの複雑なクエリ - 非常に単純なアルゴリズムのIDで複数の変数の列にSUM

+----------------+ +-----------------+ +------+ 
| fee_definition | | user_fee  | | user | 
+----------------+ +-----------------+ +------+ 
| id    | | user_id   | | id | 
| label   | | fee_id   | | ... | 
| case1   | | case   | +------+ 
| case2   | | manual_override | 
| case3   | +-----------------+ 
| case4   | 
| case5   | 
+----------------+ 

ベースは、彼らのお金の量を決定するために、ユーザーに合っている場合を決定します支払わなければならない。 user_feeは、料金定義の制限数に制限されず、1に制限されます。これは私が交差点テーブルユーザーがケース1を持つようにsettedされている場合は

+-----------+----------+--------+-------------------+ 
| user_id | fee_id | case | manual_override | 
+-----------+----------+--------+-------------------+ 
| 1  | 1  | case1 |     | 
| 1  | 3  | case1 |     | 
| 1  | 5  | case1 | 50.22   | 
| 2  | 1  | case5 |     | 
| 3  | 1  | case2 |     | 
| 3  | 2  | case2 | 18.50   | 
+-----------+----------+--------+-------------------+ 

に次の内容を持っていることを意味、値が0 GET異なる場合1の下に記載されているすべての料金は選びました。他の4つのケースでも同じことが起こります。

私がここで行ったことは、私が実行する実際のクエリはフランス語で書かれています(申し訳ありませんが、私たちはフランス語を話す開発者のチームであるため、 ):簡易版と実際のクエリからの参照用として

SELECT 
    `etudiant_etu`.*, 
    `session_etudiant_set`.*, 
    SUM(ROUND(frais_session_etudiant.fse_frais_manuel*100)/100) AS `fse_frais_manuel`, 
    `frais_session_etudiant`.`des_colonne`,   
    SUM(ROUND(definition_frais_des.des_quebecCanada*100)/100) AS `des_quebecCanada`,   
    SUM(ROUND(definition_frais_des.des_etranger*100)/100) AS `des_etranger`, 
    SUM(ROUND(definition_frais_des.des_non_credite*100)/100) AS `des_non_credite`, 
    SUM(ROUND(definition_frais_des.des_visiteur*100)/100) AS `des_visiteur`, 
    SUM(ROUND(definition_frais_des.des_explore*100)/100) AS `des_explore`, 
    `type_etudiant_tye`.*, 
    `type_formation_tyf`.*, 
    `pays_pys`.*, 
    `province_prc`.* 
FROM `etudiant_etu` 
INNER JOIN `session_etudiant_set` 
    ON session_etudiant_set.etu_id = etudiant_etu.etu_id 
INNER JOIN `frais_session_etudiant` 
    ON frais_session_etudiant.set_id = session_etudiant_set.set_id 
INNER JOIN `definition_frais_des` 
    ON definition_frais_des.des_id = frais_session_etudiant.des_id 
LEFT JOIN `type_etudiant_tye` 
    ON type_etudiant_tye.tye_id = session_etudiant_set.tye_id 
LEFT JOIN `type_formation_tyf` 
    ON type_formation_tyf.tyf_id = session_etudiant_set.tyf_id 
LEFT JOIN `pays_pys` 
    ON pays_pys.pys_code = etudiant_etu.pys_adresse_permanente_code 
LEFT JOIN `province_prc` 
    ON province_prc.prc_code = etudiant_etu.prc_adresse_permanente_code 
WHERE (set_session = 'P11') 
GROUP BY `session_etudiant_set`.`set_id` 
ORDER BY `etu_nom` asc, `etu_prenom` ASC 

:それは手動設定を扱うことになると

simplified version   actual version 
fee_definition.id   definition_frais_des.des_id 
fee_definition.case1  definition_frais_des.des_quebecCanada 
fee_definition.case2  definition_frais_des.des_etranger 
fee_definition.case3  definition_frais_des.des_non_credite 
fee_definition.case4  definition_frais_des.des_visiteur 
fee_definition.case5  definition_frais_des.des_explore 

user_fee.user_id   frais_session_etudiant.set_id 
user_fee.fee_id   frais_session_etudiant.des_id 
user_fee.case    frais_session_etudiant.des_colonne 
user_fee.manual_override frais_session_etudiant.fes_frais_manuel 

user.id     session_etudiant_set.set_id 

私が持っている問題があります。これを行う最善の方法は何でしょうか?

私はむしろ、プログラム自体ではなく、クエリ自体で処理することをお勧めします。

私が探しています、

は、手数料の合計が設定されてオーバーライド値ユーザーのためとあれば充電するために得る従って、その値の代わりにsetted実際の値を使用するようになり何の背後にあるロジックfee_definitionの値を使用します。

私は最終的な結果を表示するために4ない使用例を緩めるだけ右列

編集を保つために気にしない

これは私が終わったクエリは、IFの

5つのレベルであります
'IF(`frais_session_etudiant`.des_colonne= "des_quebec_canada", 
    SUM(IF(`frais_session_etudiant`.fse_frais_manuel > 0, 
     ROUND(`frais_session_etudiant`.fse_frais_manuel*100)/100, 
     ROUND(definition_frais_des.des_quebec_canada*100)/100) 
    ), 
    IF(`frais_session_etudiant`.des_colonne= "des_etranger", 
     SUM(IF(`frais_session_etudiant`.fse_frais_manuel > 0, 
      ROUND(`frais_session_etudiant`.fse_frais_manuel*100)/100, 
      ROUND(definition_frais_des.des_etranger*100)/100) 
     ), 
     IF(`frais_session_etudiant`.des_colonne= "des_non_credite", 
      SUM(IF(`frais_session_etudiant`.fse_frais_manuel > 0, 
       ROUND(`frais_session_etudiant`.fse_frais_manuel*100)/100, 
       ROUND(definition_frais_des.des_non_credite*100)/100) 
      ), 
      IF(`frais_session_etudiant`.des_colonne= "des_visiteur", 
       SUM(IF(`frais_session_etudiant`.fse_frais_manuel > 0, 
        ROUND(`frais_session_etudiant`.fse_frais_manuel*100)/100, 
        ROUND(definition_frais_des.des_visiteur*100)/100) 
       ), 
       IF(`frais_session_etudiant`.des_colonne= "des_explore", 
        SUM(IF(`frais_session_etudiant`.fse_frais_manuel > 0, 
        ROUND(`frais_session_etudiant`.fse_frais_manuel*100)/100, 
        ROUND(definition_frais_des.des_explore*100)/100) 
       ), 
        0 
       ) 
      ) 
     ) 
    ) 
) as frais' 

これは怪物です!としてテッドのHoppで言った:D

答えて

1

あなたがIFNULL(manual_override,非オーバーライド値ヒントの)

+0

感謝を使用することができます。最後に私はIFNULLを使用せず、IFを使用しました。データを正しく取得するには5レベルの深さにしなければなりませんでしたが、最終的に料金は1つのフィールドに集中しているため、解析するのが簡単です。 –

+0

@ジェフ - 5つのレベルの深さ?それは怪物だ!あなたが私のようなものであれば、今から1ヶ月後にSQLが解読できなくなるので、それが何をしているのかを必ず記録してください。 :) –

+0

解決策を含めるように質問を編集しました –

関連する問題