2011-05-19 78 views
1

請隨時和我一樣溫柔,因爲我在學習使用手冊,反覆試驗和(ahem)反向開源軟件工程。MySQL到PHP陣列分組重複值

我有一個MySQL查詢返回一個表像下面的(查詢已經因爲它包括連接表的總和和計數相當複雜):

DATE  ANSWER CATEGORY COUNT 
2011-01-01  Y  CAT1  22 
2011-01-01  Y  CAT2  220 
2011-01-01  N  CAT1  14 
2011-01-01  N  CAT2  530 
2011-01-02  Y  CAT1  50 
2011-01-02  Y  CAT2  270 
2011-01-02  N  CAT1  18 
2011-01-02  N  CAT2  576 

我需要的一切到單一線,日期如

DATE  Total Y  Total N  Total Cat1 Total Cat2 Total Overall 
2011-01-01  242   544   36   750   786 
2011-01-02  320   594   68   750   846 

現在,我認爲去這些數字我要去需要將它們分組到一個多維數組,這樣我可以用數字像這樣玩:

Array 
(
2011-01-01 => Array (
    Y => Array(
     [CAT1] = 22 
     [CAT2] = 220 
     ) 
    N => Array(
     [CAT1] = 14 
     [CAT2] = 530 
     ) 
    ) 
2011-01-02 => Array (
    Y => Array(
     [CAT1] = 50 
     [CAT2] = 270 
     ) 
    N => Array(
     [CAT1] = 18 
     [CAT2] = 576 
     ) 
    ) 
) 

但是,這是我陷入困境我似乎無法弄清楚foreach循環獲取數據在這個實例中的數組,並且一旦它在那裏,我如何顯示它在表中?

任何幫助將不勝感激。

回答

1
SELECT 
    DATE, 
    SUM(CASE ANSWER WHEN 'Y' THEN COUNT ELSE 0 END) AS TotalY, 
    SUM(CASE ANSWER WHEN 'N' THEN COUNT ELSE 0 END) AS TotalN, 
    SUM(CASE CATEGORY WHEN 'CAT1' THEN COUNT ELSE 0 END) AS TotalCat1, 
    SUM(CASE CATEGORY WHEN 'CAT2' THEN COUNT ELSE 0 END) AS TotalCat2, 
    SUM(COUNT) AS TotalOverall 
FROM subquery 
GROUP BY DATE 
+0

不錯,沒有想到使用案例+1比我所有的子選擇更好 – 2011-05-19 19:49:45

+0

優秀的安德烈,那工作的一種享受,謝謝! – Leseul 2011-05-20 09:31:40

0

您可以直接從SQL數據庫中提取所需的數據。

嘗試:

SELECT `DATE`, ANSWER, SUM(`COUNT`) as TOTAL 
FROM table -- Change this! 
GROUP BY `DATE`, ANSWER 

而更換ANSWER按類別,按類別獲得總。

+0

很多的歉意 - 看起來像我問題太含糊 - SQL查詢的複雜程度如此,因爲它包含了來自多個獨立表的值的總和和計數。 加上這會給我我的類別? – Leseul 2011-05-19 17:33:18

+0

真的,請看Leseul建議的小組。 DBMS +正確的SQL查詢旨在以您想要的方式返回結果,爲什麼要重新發明您的PHP代碼。 – 2011-05-19 17:47:19

1

您可以從查詢本身得到結果。

我知道這是一個不是最好的查詢,但它給你一個關於如何解決你想要什麼

SELECT theDate AS `DATE`, 
    (SELECT SUM(theCount) FROM st WHERE theAnswer = 'Y' AND theDate = a.theDate) AS 'Total Y', 
    (SELECT SUM(theCount) FROM st WHERE theAnswer = 'N' AND theDate = a.theDate) AS 'Total N', 
    (SELECT SUM(theCount) FROM st WHERE theCategory = 'CAT1' AND theDate = a.theDate) AS 'Total Cat1', 
    (SELECT SUM(theCount) FROM st WHERE theCategory = 'CAT2' AND theDate = a.theDate) AS 'Total Cat2', 
    (SELECT SUM(theCount) FROM st WHERE theCategory IN('CAT1','CAT2') AND theDate = a.theDate) AS 'Total Overall' 
FROM st AS a 
GROUP BY theDate 

結果的想法:

DATE  Total Y  Total N  Total Cat1 Total Cat2 Total Overall 
2011-01-01  242   544   36   750   786 
2011-01-02  320   594   68   846   914 
+0

感謝您花時間回答Phill。你的解決方案也運作良好,但我終於安定了Andriy的。 – Leseul 2011-05-20 09:35:51