2011-05-19 75 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