2012-11-12 34 views
1

我有一个表具有状态列,状态是1-8之间的数字。将mysql行转为列

我可以使用查询

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

http://www.artfulsoftware.com/infotree/queries.php#78 – 2012-11-12 01:39:42

+0

啊,当然!这工作'COUNT(IF(STATUS = 1,id,NULL))AS s1, COUNT(IF(STATUS = 2,id,NULL))AS s2' – Hailwood

+0

@Hailwood更好地使用'preparedStatement'。如果你有100种类型的身份呢?那么你的查询将会很长:D在我的答案下面看如何创建准备状态。 –

回答

5

你所要求做的是所谓的“转动查询”,它的MySQL遗憾的是并不支持。你必须做的是单独指定每一行,如下:

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

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

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>"; 
+0

它不是用于输出表格。它用于显示导航中该组中项目的数量,因此我需要知道每一行的含义。 – Hailwood