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