Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取一个列表,其中包含在表中找到的项目的最少次数_Mysql_Sql - Fatal编程技术网

Mysql 获取一个列表,其中包含在表中找到的项目的最少次数

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

我有一个MySQL表,其中我有一个特定的id作为来自另一个表的外键。此id不是此表的唯一id,因此我可以有许多记录具有相同的id。 我需要找出哪些ID在这个表中被看到的次数最少,然后列出一个包含它们的列表

例如,如果我有5条id=1的记录、3条id=2的记录和3条id=3的记录,我只想调出id 2和3。然而,表中的数据经常变化,所以我不知道在任何给定时刻最小值是多少。如果我使用两个查询,那么这个任务就相当简单了,但我正试图只使用一个查询。以下是我所拥有的:

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;