1

というテーブルとcategoriesというテーブルがありますbusiness_categories_coupling。カテゴリには、通常のidname、がありparentます。カップリング テーブルには、 と がbusiness_idありcategory_idます。各ビジネスには複数のカテゴリがある可能性があるため、そのテーブルに格納します。次のようになります。

business_id    category_id
73             80
73             81
73             90
74             4
74             10

現在、私のクエリはすべてのカテゴリを選択し、foreach を実行し、各ループで db クエリを実行して、そのカテゴリに含まれるビジネスの数を見つけています。明らかに正しい方法ではありません。

基本的にすべてのカテゴリを選択し、結合テーブルに表示される回数を取得し、各カテゴリにカウントを追加する SQL クエリを実行する方法はありますか?

SELECT
    C.*
FROM
    CATEGORIES AS C
LEFT JOIN
    BUSINESS_CATEGORIES_COUPLING AS B
ON
    C.id = B.category_id;

そのようなものですが、どこかにカウントがあります。さまざまな設定を試しましたが、思いどおりに動作しません。助言がありますか?

編集1

@phani-rahul が提供するソリューションですが、WHERE 句を追加しました。

SELECT cat.id AS id, cat.name AS name, cat.slug AS slug, COUNT(cat.id) AS business_count
FROM categories AS cat
LEFT JOIN business_categories_coupling AS coupling ON cat.id=coupling.category_id
WHERE coupling.category_id IS NOT NULL
GROUP BY cat.id
4

3 に答える 3

2

はいあります。Group by句を使用できます:

select a.id as category, count(a.id) as count_of_category
from categories a
left join business_categories_coupling b on a.id=b.category_id
group by a.id

結果は次のようになります。

category   count_of_category
80          2
81          5
90          1
.           .
.           .
.           .
于 2012-09-06T17:50:27.263 に答える
1

また、C テーブルのフィールドでグループ化する必要があります。

SELECT C.id, C.field1, C.field2, COUNT(*)
    FROM CATEGORIES AS C
    LEFT JOIN BUSINESS_CATEGORIES_COUPLING AS B
ON (C.id = B.category_id)
GROUP BY C.id, C.field1, ...

(MySQL ではGROUP BY、単一の値 C.id を使用できます。他の SQL 方言では、「C.*」でグループ化することにより、「C テーブルの行ごとにグループ化する」という概念を表現できます。他のいくつかの言語では、すべての非集計を指定する必要があります。クエリの列、この場合は C から選択したすべての列を 1 つずつ)。

于 2012-09-06T17:47:01.773 に答える
0

探しているのは GROUP BY 句です。

SELECT
   C.*, count(C.id)
FROM
   CATEGORIES AS C
LEFT JOIN
   BUSINESS_CATEGORIES_COUPLING AS B
ON
    C.id = B.category_id
 GROUP BY B.category_id;
于 2012-09-06T17:47:23.200 に答える