Массив MySQL в PHP группирует повторяющиеся значения - PullRequest
1 голос
/ 19 мая 2011

Пожалуйста, будьте осторожны со мной, потому что я учусь, используя руководства, метод проб и ошибок и (хм) обратный инжиниринг программного обеспечения с открытым исходным кодом.

У меня есть запрос 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, чтобы получить данные в массив в этом случае, и как только они появятся, как мне отобразить их в таблице?

Любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 19 мая 2011

Вы можете получить результаты самого запроса.

Я знаю, что это не самый лучший запрос, но он дает вам представление о том, как решить то, что вы хотите

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
1 голос
/ 19 мая 2011
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 голосов
/ 19 мая 2011

Вы можете получить нужные данные непосредственно из базы данных SQL.

Попробуйте:

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

И замените ОТВЕТ на КАТЕГОРИЮ, чтобы получить сумму по категориям.

...