Mysql

如何按 GROUP BY 中唯一條目的 COUNT(*) 排序?

  • October 17, 2020

我通過 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 ) 和viawordmap之間的多對多映射表?請提供以便我們驗證。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 個不同的單詞。那可能不是你想要的。

如果那不是您想要的,請改寫問題。

引用自:https://dba.stackexchange.com/questions/276790