簡體   English   中英

包含具有零Count()值的行

[英]Include Rows with Zero Count() Values

我正在設計一個基於標簽的偽類別系統。

那里有兩個表-連接和關鍵字。 “關鍵字”定義類別,“連接”為鄰接表。

單擊類別后,視圖將顯示子類別。

SELECT kw.kw_id, kw.kw_name, kw.kw_desc
FROM keyword AS kw, connection AS conn
WHERE conn.kw1id = :kw1 AND conn.kw2id = kw.kw_id

這樣做很好,但是現在我想按子類別對這些子類別進行排序。

SELECT  child.id AS child_id, keyword.kw_name AS child_name, keyword.kw_desc AS child_desc,
            COUNT(r1.conn_id) AS out_degree
FROM keyword
INNER JOIN connection AS r1 ON r1.kw1id = keyword.kw_id
INNER JOIN (
    SELECT kw2id AS id
    FROM connection AS conn
    WHERE conn.kw1id = [ID_CLICKED]
) AS child ON child.id = r1.kw1id

GROUP BY r1.kw1id

ORDER BY out_degree DESC

但這只會返回子類別> 0的類別。 如何包含葉節點?

只需用LEFT代替INNER就可以了...

順便說一下,您實際上並不需要該子查詢

很難確定,但是根據您的描述,我認為您想要這樣的東西?

 SELECT  k.id AS child_id,   
         k.kw_name AS child_name,  
         k.kw_desc AS child_desc,
         COUNT(rb.conn_id) AS out_degree
 FROM connection AS ra 
 LEFT JOIN keyword As k ON ra.kw2id = k.id AND ra.reltype = 'blah'
 LEFT JOIN connection As rb ON rb.kw1id = k.id AND rb.reltype = 'blah'
 WHERE ra.kw1id = [ID_CLICKED]
 GROUP BY k.id 
 ORDER BY out_degree DESC

這應該算出[ID_CLICKED]的子女中的子女,並且仍應包括無子女的子女

為避免多次計數,請更改此:

COUNT(rb.conn_id) AS out_degree

COUNT(distinct rb.kw2id) AS out_degree

所以每個大孩子只算一次

與您的原始查詢更接近-這行得通嗎? (請注意3個更改

SELECT  child.id AS child_id, keyword.kw_name AS child_name, keyword.kw_desc AS child_desc,
            COUNT(r1.conn_id) AS out_degree
FROM keyword
**LEFT** JOIN connection AS r1 ON **r1.kw2id** = keyword.kw_id
**LEFT** JOIN (
    SELECT kw2id AS id
    FROM connection AS conn
    WHERE conn.kw1id = [ID_CLICKED]
) AS child ON child.id = r1.kw1id
GROUP BY r1.kw1id
ORDER BY out_degree DESC

是的,我知道,一個問題的兩個答案...但是它們是不同的答案:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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