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

それらを 2 つの表に表示する方法は知っていますが、結合する方法がわかりません。

$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'は、true の場合に 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 に答える