0

我的 php 页面上有一个表,其中填充了来自单个表的 MySQL 查询的数据

该表如下所示:

Location    Jan Feb Mar etc…    Total
Location1   5   13  7       25
Location2   10  10  6       26  
Location3   22  1   7       29
Etc…

'Total' 由查询使用 Sum ie SUM(IF(month = '1', 1,0)) AS 'jan', SUM(IF(month = '2', 1,0)) ASfeb计算得出, SUM(IF(month = '3', 1,0))

我想要的是每列的总数(一月、二月、三月等)

我可以在 PHP 中通过在提取值时添加值来做到这一点,但我可以在查询中执行此操作 - 这样做有优势吗?

提前感谢您提供的帮助。

4

2 回答 2

1

对我来说,这是一个奇怪的数据库布局,但我通常使用基于行的方法:

location   | month | total |
loc1       |   1   |  3    |
loc2       |   1   |  4    |
loc1       |   2   |  7    |
etc...

这使得总计等更容易执行。

但是,鉴于您的结构,您可以继续做您正在做的事情,也可以使用一些技巧。如果您在 PHP 中使用它做更多的工作(除了总数),您可以轻松地concat()在 SQL 中执行 a 并获得一个准备好被explode()-ed 到数组中的预格式化字符串。从那里你可以使用 PHP 中所有美妙的数组函数来获取总数或任何你喜欢的东西。

编辑:Righto,这会有所不同。

如果您使用普通的基于行的方法来存储数据,您可以让数据库完成所有工作。如果您需要查询来获取各个月份和总数,您当然可以在 PHP 中执行此操作,但您也可以执行以下小技巧:

select
    month, // assuming 1-12 for example
    sum(someData)
from
    yourTable
where
    someCondition=1
group by
    month
union all
select
    13 as month, // assuming 1-12 for example
    sum(someData)
from
    yourTable
where
    someCondition=1
group by
    month

例如,如果您的数据库具有大量空闲 CPU,但网络服务器正在苦苦挣扎,或者您有大量数据需要统计,这将非常方便。只需让数据库进行处理并将其作为您可以在 PHP 代码中识别的特定数字返回 - 1-12 个月是正常的,第 13 个月是总数。

于 2012-08-02T08:39:49.557 回答
0

很难说,这取决于代码的其余部分。你对结果做了什么?只是输出它们?查询有多复杂?

在任何情况下,我都会GROUP BY location, month ORDER BY month在 PHP 中循环结果行来构建表。(如果某个位置缺少任何月份,则不会返回任何内容,因此请务必注意这一点。)

于 2012-08-02T08:39:36.220 回答