1

我有一个包含状态列的表,状态是 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 次,但假设这也不理想?

我还能怎么做?

4

2 回答 2

5

您要求做的事情称为“枢轴查询”,遗憾的是 MySQL 本身不支持该查询。您必须做的是单独指定每一行,如下所示:

SELECT
   SUM(IF (status = 1, total, 0)) AS '1'
   ...

..但这非常冗长——特别是如果你有很多列。我认为你的 PHP 比它需要的更详细一点,因为你不需要提前声明数组。

于 2012-11-12T01:44:09.407 回答
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>";
于 2012-11-12T01:43:51.157 回答