【问题标题】:MySQL to PHP array grouping duplicate valuesMySQL到PHP数组分组重复值
【发布时间】:2011-08-29 01:44:41
【问题描述】:

请对我温柔一点,因为我正在学习使用手册、反复试验和(咳咳)开源软件的逆向工程。

我有一个 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 循环,一旦它在那里,我如何在表格中显示它?

任何帮助将不胜感激。

【问题讨论】:

    标签: php mysql sql multidimensional-array 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
    

    【讨论】:

    • 很好,没想到使用 CASE +1 比我所有的子选择更好
    【解决方案2】:

    您可以从查询本身获得结果。

    我知道这不是最好的查询,但它可以让您了解如何解决您想要的问题

    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
    

    【讨论】:

    • 感谢您花时间回答菲尔。您的解决方案也很有效,但我最终选择了 Andriy 的解决方案。
    【解决方案3】:

    您可以直接从 SQL 数据库中提取所需的数据。

    试试:

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

    并将 ANSWER 替换为 CATEGORY 以获得按类别的总数。

    【讨论】:

    • 许多道歉 - 看起来我的问题太模糊了 - SQL 查询非常复杂,因为它已经包括来自多个单独表的值的总和和计数。另外,这会给我我的类别吗?
    • 真的,看看 Leseul 建议的 group by。 DBMS+proper-SQL-query 旨在以您想要的方式返回结果,为什么要在 PHP 代码中重新发明轮子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多