[英]select count items each group
我有兩個表類別和廣告,我需要選擇所有類別和它在廣告表中具有至少大於零的廣告數量
類別表
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
我得到了空洞的結果,我做錯了什么?
如果要確保category
表中的cat_id
位於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 ;
select cat_id, count(*)
from adverts
group by cat_id;
因此,mySQL查詢引擎將從廣告表中獲取每一行,它會將它們放入整齊的堆中,其中堆中的所有行具有相同的類別,它將計算每個堆中的行數,然后它' ll將返回每個樁的結果行,其中包含樁的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查詢引擎可能會混淆)。
你可以試試這個,交配:
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;
您必須按以下方式使用group by功能
select cat_id, count(*) as count
from adverts
group by cat_id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.