1

現時点では、2 つの異なる mysql クエリがあります。

クエリ 1

SELECT monthname( calendar.datefield ) AS date,
    year(calendar.datefield) as year, calendar.datefield, COUNT(all_griefs_tbl.actioned_status ) AS total_griefs,
    all_griefs_tbl.actioned_status, all_griefs_tbl.game
FROM all_griefs_tbl 
RIGHT JOIN calendar 
  ON ( DATE(all_griefs_tbl.actioned_date ) = calendar.datefield )
    AND all_griefs_tbl.actioned_status = 'accepted'
WHERE calendar.datefield
  BETWEEN DATE_ADD(CURDATE(), INTERVAL -12 MONTH)  AND CURDATE()
GROUP BY year( calendar.datefield ) DESC , month( calendar.datefield ) DESC

クエリ 2

SELECT monthname( calendar.datefield ) AS date, 
    year(calendar.datefield ) AS year, calendar.datefield,
    COUNT(all_griefs_tbl.actioned_status ) AS total_submitted,
    all_griefs_tbl.actioned_status, all_griefs_tbl.game 
FROM all_griefs_tbl 
RIGHT JOIN calendar 
  ON ( DATE( all_griefs_tbl.date ) = calendar.datefield ) 
WHERE calendar.datefield BETWEEN DATE_ADD( CURDATE( ) , INTERVAL -12 MONTH ) AND CURDATE( ) 
GROUP BY year( calendar.datefield ) DESC , month( calendar.datefield ) DESC

これらの違いは、クエリ1で月ごとに受け入れられた悲しみの数を数え、クエリ2で月ごとに送信されたレコードの数を数えています-異なる列を数えています

私がやりたいことは、a)これを単一のクエリにするか、b)結果を1つのテーブルにマージできるようにすることです。

出力を次のようにしたい:

    Month         Year          Total Griefs  Total Submitted
    ------------  ------------  ------------  ------------  
    April         2012          14            2      
    March         2012          0             8
    February      2012          0             6
    January       2012          0             13
    December      2011          0             7
    November      2011          0             10
    October       2011          0             0
    September     2011          0             0
    August        2011          0             6
    July          2011          0             3
    June          2011          0             2
    May           2011          0             0
    April         2011          0             0

これは可能ですか、それとも間違ったツリーを完全に吠えていますか?

ありがとう!

4

3 に答える 3

3

1 つのクエリでこれを行うことができます。

SELECT 
    monthname( calendar.datefield ) AS date,
    year(calendar.datefield) as year, 
    calendar.datefield,
    SUM(IF(all_griefs_tbl.actioned_status = 'accepted', 1, 0)) AS total_griefs,
    COUNT(all_griefs_tbl.actioned_status ) AS total_submitted,
    all_griefs_tbl.actioned_status, 
    all_griefs_tbl.game 
FROM 
    all_griefs_tbl 
RIGHT JOIN 
    calendar ON ( DATE(all_griefs_tbl.actioned_date ) = calendar.datefield ) 
WHERE 
    calendar.datefield BETWEEN DATE_ADD(CURDATE(), INTERVAL -12 MONTH)  AND CURDATE() 
GROUP BY year( calendar.datefield ) DESC , 
    month( calendar.datefield ) DESC

編集:これは少し非正統的ですが、(おそらく)あなたが求めているものを提供します:

SELECT
    month(date_add(curdate(), interval seq.mm months)),
    year(date_add(curdate(), interval seq.mm months)),
    (SELECT count(1)
       FROM all_griefs_tbl
      WHERE actioned_status = 'accepted'
        AND month(action_date) = month(date_add(curdate(), interval seq.mm months))
        AND year(action_date) = year(date_add(curdate(), interval seq.mm months))) as total_griefs
    (SELECT count(1)
       FROM all_griefs_tbl
        AND month(date) = month(date_add(curdate(), interval seq.mm months))
        AND year(date) = year(date_add(curdate(), interval seq.mm months))) as submitted_griefs
FROM
    (SELECT -12 as mm UNION SELECT -11  as mmUNION SELECT -10  as mmUNION SELECT -9  as mm
     UNION SELECT -8 as mm UNION SELECT -7  as mm UNION SELECT -6 as mm UNION SELECT -5 as mm
     UNION SELECT -4 as mm UNION SELECT -3 as mm UNION SELECT -2 as mm UNION SELECT -1 as mm) seq
ORDER BY
    mm
于 2012-04-17T15:20:47.820 に答える
0

UNION出力が 2 つのクエリと同じである場合は、クエリで使用できます。

クエリにNULL AS total_griefs,とを追加すると、出力が一致しますNULL AS total_submitted,

于 2012-04-17T15:19:45.077 に答える
0

これを試してください(実際にはテストできません)

SELECT monthname(calendar.datefield) AS date, 
       year(calendar.datefield) as year, 
       calendar.datefield, 
       SUM(CASE all_griefs_tbl.actioned_status 
               WHEN 'accepted' THEN 1 
               ELSE 0 
           END CASE) AS total_griefs,
       COUNT(all_griefs_tbl.actioned_status) AS total_submitted,
       all_griefs_tbl.actioned_status, 
       all_griefs_tbl.game 
FROM all_griefs_tbl RIGHT JOIN calendar 
    ON DATE(all_griefs_tbl.actioned_date) = calendar.datefield 
WHERE calendar.datefield 
    BETWEEN DATE_ADD(CURDATE(), INTERVAL -12 MONTH) AND CURDATE() 
GROUP BY year(calendar.datefield) DESC, 
         month(calendar.datefield) DESC
于 2012-04-17T15:22:14.430 に答える