3

2 つのテーブルを結合しようとしています。テーブルのすべての列product_category(現在は合計 6 つ) を取得し、products_has_product_categoryテーブルの各カテゴリに含まれる製品の数、CatCount をカウントします。私のクエリ結果は、最初のカテゴリと合計 68 の 1 行ですが、個々のカテゴリの数で 6 行を探しています。

<?php
          $result = mysql_query("
                        SELECT a.*, COUNT(b.category_id) AS CatCount
                        FROM `product_category` a
                        LEFT JOIN `products_has_product_category` b
                        ON a.product_category_id = b.category_id
                    ");
          while($row = mysql_fetch_array($result)) {

              echo '
              <li  class="ui-shadow" data-count-theme="d">
              <a href="' . $row['product_category_ref_page'] . '.php" data-icon="arrow-r" data-iconpos="right">' . $row['product_category_name'] . '</a><span class="ui-li-count">' . $row['CatCount'] . '</span></li>';
          }

        ?>

私はこれに数時間取り組んできましたが、私が間違っていることについて何か助けていただければ幸いです。

4

1 に答える 1

4

GROUP BY句がない場合、COUNT()集約は 1 行のみを返すことができ、WHERE句でフィルタリングした後のテーブルの合計数を保持します。サブクエリGROUP BY b.category_idに反対するつもりだと思います:LEFT JOIN

SELECT
  a.*,
  catcount
FROM
  product_category a
  LEFT JOIN (
    SELECT category_id, COUNT(*)  AS catcount
    FROM products_as_product_category 
    GROUP BY category_id
  ) subcount ON a.product_category_id = subcount.category_id

GROUP BYそもそもクエリが構文的に成功したのは、MySQL が句の内容と存在について寛大であるためです。が欠落しているため、他のほとんどの RDBMS では失敗しGROUP BYます。テーブルの内容によってはproduct_category、MySQL は、結合されたサブクエリなしで上記を実行することを許可し、代わりに句に正しい列を含めるproduct_categoryことGROUP BYができますが、そのテーブルの内容を知らなければ、確かなことは言えません。上記の方法は標準であり、MySQL の寛大さに依存することなく、他の RDBMS 間で移植可能です。

最後に、上記で実行しましたが、クエリで実行することはお勧めしません。結合されたテーブル間で共通の列名には、PHP API で区別するためのエイリアスが必要であり、混乱を招きます。リストで実際に必要な列については、常に明示することをお勧めします。SELECT *JOINSELECT

于 2012-10-16T22:58:22.013 に答える