我正在尝试创建一个最终用户页面,其中我提供了可用于签出的不同服务器。任何给定时间的服务器都可以拥有"可用"状态或"保留"状态。我正在使用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中实现此格式?
答案 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>";
}