2016-06-30 1 views
1

に発生し、値に基づいて、mysqlの列を選択し、研究をしましたが、それでも、この1別の列

とのトラブルを抱えて、私はテーブルに

class  name  score 
1   Alex  0  
1   Beth  0 
1   Chris  100 
1   Dan  90 
2   Frank  80 
2   George 0 
2   Henry  0 
3   Jill  90 
4   Kerry  0 
5   Liam  90 
5   Matt  80 
5   Nick  0 

を持っていると仮定した行を見つけたい、少なくとも2名でしたどこのクラスが> 2が、イムrelatiをレポート出力例

class  name  score 
1   Chris  100 
1   Dan  90 
5   Liam  90 
5   Matt  80 

私が最初にゼロのスコアを削除し、ネストされたクエリを試してみましたクラスを数える:同じクラスには、非ゼロのスコアを持っています初心者には簡単なものが欠けているはずです。

+1

あなたは、そのクエリを投稿することができます「私は...ネストされたクエリを試してみました」と述べました。 – Goose

答えて

1

このクエリを処理する標準的な方法の1つは、条件付き集約を持つサブクエリを使用して、2つ以上の生徒がゼロ以外のスコアを持つクラスを特定することです。元の表にこれを結合して、結果セットを取得することができます。

SELECT t1.class, t1.name, t1.score 
FROM scores t1 
INNER JOIN 
(
    SELECT class, 
     SUM(CASE WHEN score > 0 THEN 1 ELSE 0 END) AS scoreCount 
    FROM scores 
    GROUP BY class 
    HAVING scoreCount >= 2 
) t2 
    ON t1.class = t2.class 
WHERE t1.score > 0 
0

これはあなたのために動作します:

SELECT class, count(*) FROM mytable WHERE score > 0 group by class; 
:だから、内側から始まる

SELECT * 
    FROM mytable 
    WHERE 
    score > 0 AND 
    class in (
     SELECT class FROM mytable 
        WHERE score > 0 
        GROUP BY class 
        HAVING count(*) > 1) ; 

Here is a functional example with your data

は、我々は非ゼロのスコアのためのクラスの数をカウントします

これは、クラス1,5がスコア> 0の複数のクラスを持っていることを示しています。 K・カウント(*)当社SELECTのうちとHAVING句でそれを使用します。

SELECT class FROM mytable WHERE score > 0 group by class having count(*)>1; 

これはのみ

我々は今、クラスこのサブクエリからプルするクエリを構築する私たちのクラス1,5を与えますマッチ:

SELECT * 
FROM p 
WHERE class in 
(SELECT class FROM mytable WHERE score > 0 group by class having count(*)>1); 

しかし、これは私たちのサブクエリ、スコア0とでもクラスに一致するすべてのクラスを返します!したがって、WHERE句に1つ以上の条件を追加する必要があります。その結果、上記の最初のクエリが発生します。

1
SELECT DISTINCT x.* 
      FROM my_table x 
      JOIN my_table y 
      ON y.class = x.class 
      AND y.name <> x.name 
      AND y.score > 0 
      WHERE x.score > 0;