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 的项目,我无法理解我在这里做错了什么。

4

2 回答 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 RedAS CountItem匹配您的原始...

while($row = mysql_fetch_array($query) AND $row2 = mysql_fetch_array($query2)) {
  echo $row['Red'] . " " . $row2['New'] . " " . $row['Item'];
  echo "<br>";
}
于 2012-04-06T17:34:35.367 回答
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    
于 2012-04-06T17:36:22.213 回答