计算两个不同的列

时间:2012-04-06 17:30:43

标签: mysql sql count

所以我在我的数据库中有这个表

Item    Cat1    Cat2
--------------------
Aaa     Red     Used
Aaa     Blu     Used
Bbb     Gre     New
Bbb     Blu     New
Ccc     Gre     New
Ddd     Blu     Used

我希望在一列中显示 Items 红色,在另一列中显示 New ,如下所示:

Item    Red     New
-------------------
Aaa     1       0
Bbb     0       2
Ccc     0       1
Ddd     0       0

我知道如何在两个表中显示它们,但不知道如何组合它们。

$query = mysql_query("SELECT *, count(Item) AS CountItem FROM Table WHERE Cat1 = 'Red' GROUP BY Item");
$query2 = mysql_query("SELECT *, count(Item) AS CountItem2 FROM Table WHERE Cat2 = 'New' GROUP BY Item");

while($row = mysql_fetch_array($query) AND $row2 = mysql_fetch_array($query2))
  {
  echo $row['CountItem'] . " " . $row2['CountItem2'] . " " . $row['Item'];
  echo "<br>";
  }

这似乎不起作用,因为这只显示标记为Aaa的 Items ,而我无法理解我在这里做错了什么。

2 个答案:

答案 0 :(得分:15)

这是SUM(CASE)的作业:

SELECT 
  Item,
  SUM(CASE WHEN Cat1 = 'Red' THEN 1 ELSE 0 END) AS Red,
  SUM(CASE WHEN Cat2 = 'New' THEN 1 ELSE 0 END) AS New
FROM Table
GROUP BY Item

这里的想法是,对于所有Red行,您指定1(其他人得到0),然后将这些1和0相加以获得计数。 New值相同。

通过利用MySQL的0/1布尔评估,您可以更简洁地做同样的事情:

SELECT 
  Item,
  SUM(Cat1 = 'Red') AS Red,
  SUM(Cat2 = 'New') AS New
FROM Table
GROUP BY Item

在此示例中,如果为Cat1 = 'Red',则返回1,并将其汇总。除了MySQL以外,SUM(CASE)方法在RDBMS之间更容易移植,但是如果其他系统以不同的方式对待它们的布尔值。

编辑:

然后澄清一下,在PHP中,您将检索这些$row['Red']$row['New']。您可以将别名更改为您需要的任何内容:AS RedAS CountItem以匹配您的原始内容...

while($row = mysql_fetch_array($query) AND $row2 = mysql_fetch_array($query2)) {
  echo $row['Red'] . " " . $row2['New'] . " " . $row['Item'];
  echo "<br>";
}

答案 1 :(得分:1)

SELECT
  Item, 
  SUM(CASE WHEN Cat1 = 'Red' THEN 1 ELSE 0 END)  AS Red,
  SUM(CASE WHEN Cat2 = 'New' THEN 1 ELSE 0 END)  AS New,
FROM 
  Table 
GROUP BY
  Item