统计两个不同的列

8

我有一个数据库中的表格

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

我希望展示一列中有多少个红色的物品,以及另一列中有多少个新的物品,就像这样:

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的,我在这里犯了什么错误,感到困惑。
2个回答

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,并被累加起来。然后使用 SUM(CASE) 方法可在除 MySQL 以外的其他 RDBMS 中更容易移植,因为其他系统可能对布尔值的处理方式不同。
注:在 PHP 中,你可以用 $row['Red']$row['New'] 来检索它们。你也可以根据需要更改别名,例如将 AS Red 改为 AS CountItem 以匹配原始内容...
while($row = mysql_fetch_array($query) AND $row2 = mysql_fetch_array($query2)) {
  echo $row['Red'] . " " . $row2['New'] . " " . $row['Item'];
  echo "<br>";
}

了解短的mySQL版本很好。 - рüффп

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    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接