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
我有这样的数据集:
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