1

我有一个名为的表categories和一个名为 的表business_categories_coupling。在类别中,您有通常的id, name, parent。在耦合表中,您有business_idcategory_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 表的字段进行 GROUP。

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 中选择的所有列,一一对应)。

于 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 回答