Mysql查询,使用字段作为列

时间:2013-10-24 15:06:54

标签: php mysql database

我有以下表结构

+-------+------------+-----------+---------------+
| id    |assigned_to | status    |  group_id     |              
+-------+------------+-----------+---------------+
| 1     | 1001       | 1         |    19         |
+-------+------------+-----------+---------------+
| 2     | 1001       | 2         |    19         |
+-------+------------+-----------+---------------+
| 3     | 1001       | 1         |    18         |
+-------+------------+-----------+---------------+
| 4     | 1002       | 2         |    19         |
+-------+------------+-----------+---------------+
| 5     | 1002       | 2         |    19         |
+-------+------------+-----------+---------------+

我想以下列格式获取信息

+-------+------------+-----------+
|       |   1001     |   1002    |          
+-------+------------+-----------+
| 1     |    1       |    0      |   
+-------+------------+-----------+
| 2     |    1       |    2      |   
+-------+------------+-----------+

所以基本上我希望将指定的字段用作列名。然后行代表状态。因此,例如在表中我们有两行,其中用户1002的状态为2,因此总和显示在该特定状态行上。

请注意,group_id必须为19.因此,为什么我在桌面上遗漏了ID为3的行。

有人能指出我正确的方向吗?我确定这种类型的查询有一个名称,但我不能为我的生活把它写成文字。我尝试了其他各种查询,但是没有一个能够接近这个问题。

2 个答案:

答案 0 :(得分:1)

您可能希望阅读本文http://www.artfulsoftware.com/infotree/qrytip.php?id=523

我会像

SELECT 
  assigned_to, 
  COUNT( CASE assigned_to WHEN '1001' THEN 1 ELSE 0 END ) AS '1001', 
  COUNT( CASE assigned_to WHEN '1002' THEN 1 ELSE 0 END ) AS '1002'
FROM table
WHERE group_by = 19
GROUP BY assigned_to WITH ROLLUP; 

或类似的东西(我还没有测试过这段代码..)

在文章中,他使用SUM()使用COUNT()执行此操作,并为group_id添加WHERE约束

希望这有帮助

答案 1 :(得分:1)

Marc B是对的,没有办法转动表-i.e.将字段的内容转换为列 - 除非你做出一些假设,比如认为assigned_to的值有些固定。

另一方面,这是程序可以解决的问题。这不是一个简单的程序,但它可以完成这项工作。

我最近在java中创建了一个与此类似的程序,如果你感兴趣我可以在这里发布它的核心。