Mysql
如何按 GROUP BY 中唯一條目的 COUNT(*) 排序?
我通過 tag_map 搜尋為
SELECT ArticleID,COUNT(*) AS C FROM WordMap WHERE WordID IN( SELECT WordID FROM Words WHERE Word IN ('word1', 'word2') ) GROUP BY ArticleID ORDER BY C DESC
我想獲取所有單詞(此處為 word1 和 word2)首先出現的文章 ID。
上述查詢按數字順序返回(例如,如果 word1 出現 100 次)。
注意:WordMap 表很大,這就是我使用子查詢而不是 JOIN 的原因。
我回答這個問題是因為@ypercubeᵀᴹ 不願意這樣做,我認為這可能對其他人有所幫助。
棘手的部分是使用
COUNT(DISTINCT WordID)
而不是COUNT(*)
,因為後者不考慮重複。正如@ypercubeᵀᴹ 所建議的那樣,考慮到唯一單詞的數量和總出現次數,最終的解決方案是使用
COUNT(DISTINCT WordID)
和COUNT(*)
一起具有完美的順序。查詢看起來像
SELECT ArticleID,COUNT(*) AS C, COUNT(DISTINCT WordID) AS D FROM WordMap WHERE WordID IN( SELECT WordID FROM Words WHERE Word IN ('word1', 'word2') ) GROUP BY ArticleID ORDER BY D DESC, C DESC
聽起來像是(via ) 和via
wordmap
之間的多對多映射表?請提供以便我們驗證。articles``article_id``words``word_id``SHOW CREATE TABLE
我建議這是“過度規範化”。相反,有
CREATE TABLE wordmap ( article_id INT ..., word VARCHAR(77) ..., PRIMARY KEY(article_id, word), INDEX(word, article_id) ) ENGINE=InnoDB;
然後
SELECT ArticleID, COUNT(*) AS C FROM WordMap WHERE Word IN ('word1', 'word2') GROUP BY ArticleID ORDER BY C DESC
會說哪些文章有這兩個詞。
COUNT
表示是否存在 1 個或 2 個不同的單詞。那可能不是你想要的。如果那不是您想要的,請改寫問題。