所以我在我的数据库中有这个表
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 ,而我无法理解我在这里做错了什么。
答案 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 Red
到AS 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