2015-02-10 27 views
2

我有一個這樣的數據集:MySQL的返回一行只有當所有行的價值在哪裏

col1 col2 
John 1 
John 1 
Emily 1 
Emily 2 

簡單select distinct col1 from table where col2 = 1回報約翰和埃米莉。

我想要一個查詢,導致只有約翰,因爲埃米莉有至少一個其他行,其中COL2不等於1

任何想法?

+0

您似乎沒有PRIMARY KEY。及時,這可能會有問題。 – Strawberry 2015-02-10 12:25:54

回答

0

嘗試用having子句:

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

編輯

薩爾曼的回答看起來太漂亮:

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

使用avg()...其中.... group by – 2015-02-10 12:24:17

+0

你能解釋一下Benny嗎? – Joanvo 2015-02-10 12:26:36

0

如果你有一個唯一的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 

該查詢獲取表中的所有行,並試圖在表中找到具有相同名稱的另一行,但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) 

此查詢在表那裏有沒有使用相同名稱的任何其他行中的所有行,但在COL2不同的值。

0

認爲你可以簡單地這樣做:

SELECT col1 
FROM table 
GROUP BY col1 
HAVING COUNT(*) = COUNT(CASE WHEN col2 = 1 THEN 1 ELSE NULL END) 

SQLFiddle

0

我目前還沒有一個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 
相關問題