MySQL return 单行仅当所有行都是WHERE的值

MySQL return a single row only when all rows are the value of the WHERE

我有这样的数据集:

col1    col2
John    1
John    1
Emily   1
Emily   2

一个简单的 select distinct col1 from table where col2 = 1 returns 约翰和艾米丽。

我想要一个只返回 John 的查询,因为 Emily 至少还有一行 col2 不等于 1。

有什么想法吗?

尝试使用 having 子句:

select col1 
from table 
group by col1 
having count(distinct col2) = 1
and min(col2) = 1

编辑

Salman 的回答看起来也不错:

select col1 
from table 
group by col1  1
having count(*) = count(case when col2 = 1 then 1 else null end)

如果您有一个唯一的 ID 列,您可以执行以下操作:

SELECT DISTINCT
    Col1
FROM
    table t1
    LEFT JOIN t2 ON t1.col1 = t2.col1 AND t1.col2 <> t2.col2 AND t1.ID < t2.ID
WHERE
    t1.col2 = 1
    AND t2.col1 IS NULL

该查询获取 table 中的所有行,并尝试在 table 中查找具有相同名称但在 col2 中具有更高值的另一行。

另一种方法是使用 NOT EXISTS:

SELECT DISTINCT
    col1
FROM
    table
WHERE
    col2 = 1
    AND NOT EXISTS (SELECT
                    NULL
               FROM
                    Table T2
               WHERE
                    Table.col1 = T2.col1
                    AND Table2.col2 <> T2.col2)

此查询查找 table 中的所有行,其中在 col2 中没有任何具有相同名称但具有不同值的其他行。

我目前没有 mySQL 数据引擎,但这适用于 MS-SQL 引擎。 希望你能找到一些提示。

select name, avg(cast(num as decimal(4,2) )) from test1
group by name
having  avg(cast(num as decimal(4,2) ))=1