簡體   English   中英

計算 MySQL 列中最頻繁的元素

[英]Count most frequent element in a column in MySQL

我有以下問題。

我必須列,並且我希望每個唯一條目的第一列是第二列中最常見的元素。 一個例子是:

COL A    COL B
1        a
2        c
2        c
1        a
1        b
2        d  

查詢應輸出:

Col A    COL B
1        a
2        c

鑒於此示例數據:

CREATE TABLE t
    (`a` int, `b` varchar(1))
;

INSERT INTO t
    (`a`, `b`)
VALUES
    (1, 'a'),
    (2, 'c'),
    (2, 'c'),
    (1, 'a'),
    (1, 'b'),
    (2, 'd')
;

您首先必須使用如下查詢獲取每個計數:

SELECT
a, b,
COUNT(*) AS amount
FROM
t
GROUP BY 
a, b

然后你可以使用這個查詢作為子查詢來獲取某個列包含最大值的行。 手冊中有一篇很好的文章: The Rows Holding the Group-wise Maximum of a certain Column

例如,選擇上述文章中描述的最后一種方法,您的最終查詢將是:

SELECT sq1.a, sq1.b FROM
(
    SELECT
    a, b,
    COUNT(*) AS amount
    FROM
    t
    GROUP BY 
    a, b
) sq1
LEFT JOIN 
(
    SELECT
    a, b,
    COUNT(*) AS amount
    FROM
    t
    GROUP BY 
    a, b
) sq2 ON sq1.a = sq2.a AND sq1.amount < sq2.amount
WHERE sq2.amount IS NULL;

有了這個結果:

+------+------+
| a    | b    |
+------+------+
|    1 | a    |
|    2 | c    |
+------+------+

SELECT子句中使用子SELECT是解決問題的簡單方法:

SELECT ColA, (SELECT ColB
    FROM yourtable i
    WHERE i.ColA = o.ColA
    GROUP BY ColB
    ORDER BY COUNT(*) DESC
    LIMIT 1) AS ColB
FROM yourtable o
GROUP BY ColA;

o只是外部查詢的別名, i是內部查詢的別名。 WHERE子句的工作需要它們。

上面的查詢是以下查詢的結果,用於查找具有給定ColAColB最常見的ColA

SELECT ColB
FROM yourtable
WHERE ColA = 1 -- Replace 1; this is where the magic happens in the above query
GROUP BY ColB
ORDER BY COUNT(*) DESC
LIMIT 1

你必須為此創建我的 Sql 函數,假設你的函數名稱是 getMaxOccr 所以它看起來像

CREATE FUNCTION `getMaxOccr`(val INT) 
RETURNS varchar(25) CHARSET latin1
BEGIN

DECLARE answer VARCHAR(25) DEFAULT '';

SELECT colb FROM `tablename` 
WHERE cola = val 
ORDER BY COUNT(colb) 
DESC    INTO answer;
RETURN answer;

END

創建此函數后,您只需調用

SELECT cola,getMaxOccr(cola) from tablename GROUP BY cola

這將為您提供您正在尋找的列表希望這會有所幫助

暫無
暫無

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

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