2016-09-22 2 views
0

データベース化可能なサーバー側プロセスのJsonを生成するために、PHPスクリプト内の結合、サブクエリなどで複雑なクエリを使用する必要があります。 Datatablesはサブクエリを受け入れないので、「フラット」なクエリが必要です。私はビューを生成することを考えましたが、サブクエリはMySQLビューでも受け入れられません! ここにMySQLのクエリがあります。あなたは何をお勧めします ?複雑なMySQLクエリー:ビュー(データテーブル...)を扱うソリューション

SELECT a.Customers 
    ,a.Agent 
    ,a.status_name AS Current_Status 
    ,round(c.LTGGR - e.LT_TotBonus, 0) AS LT_NGR 
    ,CONCAT (
     round(e.LT_TotBonus/c.LTRM * 100, 0) 
     ,'%' 
     ) AS LT_Bonus_RM_per 
    ,CONCAT (
     'x' 
     ,round(c.LTBETS/(c.LTRM + e.LT_TotBonus), 0) 
     ) AS LT_Wagering 
    ,coalesce(d.Last_30D_RM, 0) AS Last_30D_RM 
    ,coalesce(d.Last_30D_NGR, 0) AS Last_30D_NGR 
    ,coalesce(g.CashBack_Last30D, 0) AS Cash_Back_30D 
    ,CONCAT (
     (f.cash_back_BO_per * 100) 
     ,'%' 
     ) AS status_cash_Back_BO_per 
    ,CONCAT (
     f.cash_back_per * 100 
     ,'%' 
     ) AS cash_back_percent 
    ,CASE 
     WHEN f.cash_back_per = 0 
      THEN 0 
     WHEN c.LTGGR - e.LT_TotBonus < 0 
      THEN 0 
     WHEN d.Last_30D_RM < 0 
      THEN 0 
     WHEN e.LT_TotBonus/c.LTRM * 100 >= f.cash_back_BO_per * 100 
      THEN 0 
     WHEN round(d.Last_30D_NGR * f.cash_back_per, 0) - coalesce(g.CashBack_Last30D, 0) < 0 
      THEN 0 
     WHEN isnull(d.Last_30D_NGR) 
      THEN 0 
     WHEN d.Last_30D_NGR < 0 
      THEN 0 
     ELSE round(d.Last_30D_NGR * f.cash_back_per, 0) 
     END AS cash_back_calc 
    ,CASE 
     WHEN f.cash_back_per = 0 
      THEN 'No Cash Back for Status' 
     WHEN c.LTGGR - e.LT_TotBonus < 0 
      THEN 'LT NGR <0' 
     WHEN d.Last_30D_RM < 0 
      THEN 'No RM Deposit in 30D' 
     WHEN e.LT_TotBonus/c.LTRM * 100 >= f.cash_back_BO_per * 100 
      THEN 'Above LT Bonus Percentage' 
     WHEN coalesce(g.CashBack_Last30D, 0) > 0 
      AND round(d.Last_30D_NGR * f.cash_back_per, 0) - coalesce(g.CashBack_Last30D, 0) < 0 
      THEN 'CashBack in 30D> Cash Back Calculated' 
     WHEN isnull(d.Last_30D_NGR) 
      THEN 'No NGR in 30D' 
     WHEN d.Last_30D_NGR < 0 
      THEN 'Negative NGR in 30D' 
     ELSE '' 
     END AS note 
FROM (
    (
     SELECT * 
     FROM players_levels 
     WHERE date_format(Date_Status, '%Y-%m') = (
       SELECT date_format(max(players_levels.Date_Status), '%Y-%m') 
       FROM players_levels 
       ) 
     GROUP BY Customers 
     ) a LEFT JOIN (
     SELECT * 
     FROM players_levels 
     WHERE date_format(Date_Status, '%Y-%m') = (
       SELECT date_format(max(players_levels.Date_Status) - INTERVAL 1 MONTH, '%Y-%m') 
       FROM players_levels 
       ) 
     ) b ON a.Customers = b.Customers 
    LEFT JOIN (
     SELECT Customers 
      ,sum(Total_Win_Loss) AS LTGGR 
      ,sum(Real_Money) AS LTRM 
      ,sum(Total_Bets) AS LTBETS 
     FROM Online_customer_activity_v2 
     GROUP BY Customers 
     ) c ON a.Customers = c.Customers 
    LEFT JOIN (
     SELECT Customers 
      ,sum(Real_Money) AS Last_30D_RM 
      ,sum(Total_Win_Loss) - sum(_Bonuses) AS Last_30D_NGR 
     FROM Online_customer_activity_v2 
     WHERE Online_customer_activity_v2.DATE >= (NOW() - INTERVAL 1 MONTH) 
     GROUP BY Customers 
     ) d ON a.Customers = d.Customers 
    LEFT JOIN (
     SELECT Account 
      ,sum(CASE 
        WHEN Method LIKE '%BONUS%' 
         AND (Method NOT LIKE '%CASHBACKBONUS%') 
         THEN Amount 
        ELSE 0 
        END) LT_Bo_No_CashB 
      ,sum(CASE 
        WHEN Method LIKE 'CASHBACKBONUS' 
         THEN Amount 
        ELSE 0 
        END) LT_CashBack 
      ,sum(CASE 
        WHEN Method LIKE '%BONUS%' 
         AND (Method NOT LIKE '%CASHBACKBONUS%') 
         THEN Amount 
        ELSE 0 
        END) + sum(CASE 
        WHEN Method LIKE 'CASHBACKBONUS' 
         THEN Amount 
        ELSE 0 
        END) AS LT_TotBonus 
     FROM `Online_dailyfinance_v2` 
     GROUP BY Account 
     ) e ON a.Customers = e.Account 
    LEFT JOIN (
     SELECT loyalty_points.status_name 
      ,loyalty_points.cash_back_per 
      ,loyalty_points.cash_back_BO_per 
     FROM loyalty_points 
     ) f ON a.status_name = f.status_name 
    LEFT JOIN (
     SELECT Account 
      ,sum(CASE 
        WHEN Method LIKE 'CASHBACKBONUS' 
         THEN Amount 
        ELSE 0 
        END) AS CashBack_Last30D 
     FROM `Online_dailyfinance_v2` 
     WHERE Online_dailyfinance_v2.DATE >= (NOW() - INTERVAL 1 MONTH) 
     GROUP BY Account 
     ) g ON a.Customers = g.Account 
    ) 
ORDER BY c.LTRM DESC 
+0

これはコード翻訳サービスではありません。サブクエリを使用できない場合は、サブクエリを使用しないように書き直す必要があります。 –

+0

あなたの有益なコメントをありがとう。誰かが親切に私にヒントを与えることができるかもしれません... –

+0

JOINのサポートを有効にするサーバー側PHPハンドラの回避策があります。[この回答](http://stackoverflow.com/a/31007028/3549014) –

答えて

0

@Renaud、私はこの野心的なクエリを作成する際にあなたの執拗さを称賛します。際立っていることの1つは、 "LIKE"ステートメントを実行する必要があるということです。私は "テキスト"のキーとして "TINYINT"を持つ多くの "参照テーブル"を使用します。だから私は "CASHBACKBONUS"への鍵として "5"を、そして単に "BONUS"への鍵として "3"を持つかもしれない。あなたはそれが単に物事になる方法を見ますか?私は、悪い態度のスクリプト児童が私のヒント/答えを投票しないように願っていますが、このようなクエリが必要な状況に遭遇したときは、通常、必要なデータの範囲でサマリーテーブルを作成します。それはしばしばではありませんが、時折必要です。私はコーディングを容易にするならば、3番目の正規形(ああ、HORROR!)に違反するでしょう。しかし、私は自分のDBを管理する人なので、これらの変更を行うことができるかどうかわかりません。私は25年以上DBのものをやってきたので、価値があると思うようにそれを取ってください。

+0

を参照してください。ええ、私は役に立たない、卑劣な「答え」も好きではありません。 RTFMとマニュアルはしばしばあいまいであいまいなので、特にRTFMが好きではありません。例:PDO BindValueのdefとBindParamのdefを見てください。それは疑問のボートロードを引き起こし、それでも誰かが "RTFM"と言うつもりです。私はそれらの人々について自分の考えを保つつもりです。 – McAuley

関連する問題