每组选择计数项目

时间:2015-05-19 07:26:39

标签: mysql sql

我有两个表类别和广告,我需要选择所有类别以及广告表中至少计数大于零的广告数量

类别表

cat_id   |  Name
----------------
1        | Toys
2        | fashion
3        | electronics

广告表

cat_id   |  title
 ----------------
1        | a
2        | b
2        | c
1        | d
2        | e

我的期望

cat_id  | count  | Name
-----------------------
1       |2       | a
2       |3       | b

我试过的查询

Select 
c.name, c.cat_id,c.parent_id, @count:= (Select Count(av.cat_id) From adsview av Where av.cat_id = c.cat_id)
from 
category c  WHERE @count > 0

我得到的结果是空的,我做错了什么?

4 个答案:

答案 0 :(得分:3)

如果您想确保cat_id表中的category位于adverts表中,您需要加入

select 
c.cat_id,
c.Name,
count(a.cat_id) as `count` 
from category c 
join adverts a on a.cat_id = c.cat_id 
group by c.cat_id ;

答案 1 :(得分:1)

select cat_id, count(*)
from adverts
group by cat_id;

因此,mySQL查询引擎将从广告表中获取每一行,它会将它们放入整齐的堆中,其中堆中的所有行具有相同的类别,它将计算行中的行数每一堆,然后它将返回每个桩的结果行,其中包含桩的id和行数。

现在让我们添加一些东西:我们也想获得类别的名称。所以我们在select子句中指出,并在from子句中添加一个连接。对于表a中的每一行,连接说"将其与表b中的每一行一起考虑。如果某些条件成立,则将此组合行放入from set"。你可以看到SQL中的连接实际上相当慢(相对)。

select c.cat_id, count(*) as count, c.name
from adverts as a join categories as c on a.cat_id = c.cat_id
group by c.cat_id;

另请注意,我已将表别名为a和c,以消除列名称cat_id的歧义(否则mySQL查询引擎可能会混淆)。

答案 2 :(得分:1)

你可以试试这个,交配:

SELECT
    c.cat_id,
    COUNT(a.cat_id) AS count,
    a.title
FROM
    category c
    LEFT JOIN adverts a ON a.cat_id = c.cat_id
GROUP BY
    c.cat_id
HAVING
    count > 0;  

或者这个:

SELECT
    c.cat_id,
    COUNT(a.cat_id) AS count,
    a.title
FROM
    category c
    INNER JOIN adverts a ON a.cat_id = c.cat_id
GROUP BY
    c.cat_id;

答案 3 :(得分:0)

您必须按照以下功能使用分组

select cat_id, count(*) as count
from adverts
group by cat_id;