Mysql 获取一个列表,其中包含在表中找到的项目的最少次数
我有一个MySQL表,其中我有一个特定的id作为来自另一个表的外键。此id不是此表的唯一id,因此我可以有许多记录具有相同的id。 我需要找出哪些ID在这个表中被看到的次数最少,然后列出一个包含它们的列表 例如,如果我有5条id=1的记录、3条id=2的记录和3条id=3的记录,我只想调出id 2和3。然而,表中的数据经常变化,所以我不知道在任何给定时刻最小值是多少。如果我使用两个查询,那么这个任务就相当简单了,但我正试图只使用一个查询。以下是我所拥有的:Mysql 获取一个列表,其中包含在表中找到的项目的最少次数,mysql,sql,Mysql,Sql,我有一个MySQL表,其中我有一个特定的id作为来自另一个表的外键。此id不是此表的唯一id,因此我可以有许多记录具有相同的id。 我需要找出哪些ID在这个表中被看到的次数最少,然后列出一个包含它们的列表 例如,如果我有5条id=1的记录、3条id=2的记录和3条id=3的记录,我只想调出id 2和3。然而,表中的数据经常变化,所以我不知道在任何给定时刻最小值是多少。如果我使用两个查询,那么这个任务就相当简单了,但我正试图只使用一个查询。以下是我所拥有的: SELECT id FROM tabl
SELECT id
FROM table
GROUP BY id
HAVING COUNT(*) = MIN(SELECT COUNT(*) FROM table GROUP BY id)
如果我将COUNT(*)替换为3,则会出现结果,但使用上面的查询会给我一个错误,即MIN未正确使用。有什么建议吗?我想试试:
SELECT id
FROM table
GROUP BY id
HAVING COUNT(*) = (SELECT COUNT(*) FROM table GROUP BY id ORDER BY COUNT(*) LIMIT 1);
这将从计数集中按升序选择第一行获得最小值。您需要
按分组
生成一组分组值,并进行额外选择以从该组中获得MIN
值,只有这样您才能将其与
SELECT * FROM table GROUP BY id
HAVING COUNT(*) =
(SELECT MIN(X.CNT) AS M FROM(SELECT COUNT(*) CNT FROM table GROUP BY id) AS X)
在
having
子句中,您需要一个双select
:
SELECT id
FROM table
GROUP BY id
HAVING COUNT(*) = (SELECT MIN(cnt) FROM (SELECT COUNT(*) as cnt FROM table GROUP BY id) t);
MIN()
aggregate函数用于获取列,而不是查询。因此,我认为有两种方法可以解决这个问题:
- 要正确写入子查询,或
- 使用临时变量的步骤
select id
from yourTable
group by id
having count(id) = (
select min(c) from (
select count(*) as c from yourTable group by id
) as a
)
set @minCount = (
select min(c) from (
select count(*) as c from yourTable group by id
) as a
);
select id
from yourTable
group by id
having count(*) = @minCount;
第二种选择:
select id
from yourTable
group by id
having count(id) = (
select min(c) from (
select count(*) as c from yourTable group by id
) as a
)
set @minCount = (
select min(c) from (
select count(*) as c from yourTable group by id
) as a
);
select id
from yourTable
group by id
having count(*) = @minCount;