我有两个表类别和广告,我需要选择所有类别以及广告表中至少计数大于零的广告数量
类别表
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
我得到的结果是空的,我做错了什么?
答案 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;