PHP - 将多个项目合并为一个

时间:2015-05-14 20:59:50

标签: php mysql sorting

我正在尝试创建一个最终用户页面,其中我提供了可用于签出的不同服务器。任何给定时间的服务器都可以拥有"可用"状态或"保留"状态。我正在使用MySQL后端。这就是我查询的方式:

SELECT *, COUNT(CASE WHEN Status = 'Available' THEN 1 ELSE NULL END) AS Amount
FROM products GROUP BY id

这是我得到的结果:

id,Server_Type,Status,Amount
1,BL460,Available,1
2,BL460,Available,1
3,BL460,Reserved,0
4,BL460,Reserved,0
5,BL460,Reserved,0
6,DL360,Available,1
7,DL360,Reserved,0
8,DL360,Reserved,0

Reserved等于0,Available等于1.我只希望最终用户能够以Available状态签出服务器。

问题:我想在页面中执行的操作是以这种方式显示页面上的服务器列表,其中Available等于金额:

BL460 - Amount: 2
DL360 - Amount: 1

如何在PHP中实现此格式?

2 个答案:

答案 0 :(得分:1)

另一个选项是交叉表查询 -

SELECT `Status`,
SUM(IF(`Server_Type` = 'BL460' AND `Status` = 'Available', `Amount`, 0)) AS `BL460`,
SUM(IF(`Server_Type` = 'DL360' AND `Status` = 'Available', `Amount`, 0)) AS `DL360`
FROM `products`
GROUP BY `Status`

你的桌子看起来像这样 -

Status    |    BL460    |    DL360    |
Available |        2    |        1    |
Reserved  |        0    |        0    |

这是EXAMPLE

更好的办法是翻转事物 -

SELECT `server_type`,
SUM(IF(`status` = 'Available', 1, 0)) AS `Available`,
SUM(IF(`status` = 'Reserved', 1, 0)) AS `Reserved`
FROM `servers`
GROUP BY `server_type`;

这会导致表格看起来像这样(基于小提琴中的数据) -

server_type    |    Available    |    Reserved
BL460          |            3    |           1
DL360          |            1    |           2

这是EXAMPLE

在这里,我可以继续向表中添加服务器,而不必担心像在第一个查询中那样将它们添加到查询中。如果您添加其他状态,则必须更改查询。

请注意,在这两种情况下,都不需要Amount,因为状态是计算的项目。通过将负载放在数据库服务器上,可以更容易地输出HTML,因为您正常地按行排列行。

答案 1 :(得分:0)

嗯,如果你直接在SQL查询中这样做可能会更容易:

SELECT Server_Type, COUNT(*) AS Count FROM products WHERE Status = 'Available' GROUP BY Server_Type

这应该可以为您提供所需的表格。

如果您想在PHP中执行此操作,最简单的解决方案可能是循环您的SQL结果并计算Server_Type是您的关联数组中每Server_Type个可用服务器的数量数组键:

$amounts = array();

foreach($sql_result as $entry) {
    if($entry['Amount'] == 1) {
        if(isset($amounts[$entry['Server_Type']])) {
            $amounts[$entry['Server_Type']]++;
        } else {
            $amounts[$entry['Server_Type']] = 1;
        }
    }
}

echo $amounts;

修改:为了按照问题中的说明打印值,您可以使用以下代码段:

foreach($amounts as $name=>$amount) {
    echo $name + " - Amount: " + $amount + "<br>";
}