我有一个具有状态列的表,状态是1-8之间的数字。
我可以使用查询
SELECT status, COUNT(id) AS total
FROM cart_orders
GROUP BY status;
获得如下结果:
status | total
1 | 10
2 | 15
3 | 8
4 | 51
5 | 65
...
但这意味着每当我需要我必须做的数据时:
$status = array(1 => null, 2 => null, 3 => null, 4 => null,
5 => null, 6 => null, 7 => null, 8 => null);
foreach($rows as $row){
$status[$row['status']] = $row['total'];
}
虽然不是很多代码,但我希望避免这样做,
我想要的是修改查询,以便最终得到一行如下所示:
1 | 2 | 3 | 4 | 5
10 | 15 | 8 | 51 | 65 ...
所以我可以去,例如$row['4']
我唯一想到的就是将每个列作为子查询,我宁愿使用代码而不是8个子查询。另一种选择是将表连接7次,但这似乎也不理想?
我怎么能这样做?
答案 0 :(得分:5)
您要求做的事情被称为“数据透视查询”,但遗憾的是MySQL本身并不支持。您必须做的是单独指定每一行,如:
SELECT
SUM(IF (status = 1, total, 0)) AS '1'
...
..但这非常冗长 - 特别是如果你有很多专栏。我认为你的PHP比它需要的更冗长,因为你不需要提前声明数组。
答案 1 :(得分:1)
这不是您要更改的查询,而是您如何显示从中获取的信息。 试试这样的事情
// insert code to whatever defines your $rows variable
$string1 = "<tr>";
$string2 = "<tr>";
foreach($rows as $row) {
$string1 .= "<td>" . $row['status'] . "</td>";
$string2 .= "<td>" . $row['total'] . "</td>";
}
$string1 .= "</tr>\n";
$string2 .= "</tr>\n";
echo "<table border=\"1\">\n";
echo $string1;
echo $string2;
echo "</table>";