计算两个不同的列

use*_*885 8 mysql sql count

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

Item    Cat1    Cat2
--------------------
Aaa     Red     Used
Aaa     Blu     Used
Bbb     Gre     New
Bbb     Blu     New
Ccc     Gre     New
Ddd     Blu     Used
Run Code Online (Sandbox Code Playgroud)

我希望在一列中显示有多少红色,在另一列中显示新项,如下所示:

Item    Red     New
-------------------
Aaa     1       0
Bbb     0       2
Ccc     0       1
Ddd     0       0
Run Code Online (Sandbox Code Playgroud)

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

$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>";
  }
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ski 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
Run Code Online (Sandbox Code Playgroud)

这里的想法是,对于所有Red行,你分配一个(其他人得到一个0),你加上那些1和0来得到计数.同样的事情New值.

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

SELECT 
  Item,
  SUM(Cat1 = 'Red') AS Red,
  SUM(Cat2 = 'New') AS New
FROM Table
GROUP BY Item
Run Code Online (Sandbox Code Playgroud)

在这个例子中,Cat1 = 'Red'如果为真,则返回1,并将它们相加.SUM(CASE)如果其他系统对待他们的布尔值不同,那么该方法将在除MySQL之外的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>";
}
Run Code Online (Sandbox Code Playgroud)