繁体   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