将mysql行转换为列

时间:2012-11-12 01:37:43

标签: php mysql sql

我有一个具有状态列的表,状态是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次,但这似乎也不理想?

我怎么能这样做?

2 个答案:

答案 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>";