簡體   English   中英

每組選擇計數項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM