根据另一列中的出现次数和值选择mysql列

时间:2016-06-30 13:28:35

标签: mysql

做过研究,但仍然遇到这个问题

假设我有表

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个名称的行具有非零分数:示例输出

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

我尝试了一个嵌套查询,首先删除零分,然后计算报告类>的类。 2但我是一个相对初学者,必须缺少一些简单的东西。

3 个答案:

答案 0 :(得分: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

答案 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;

答案 2 :(得分:0)

这对你有用:

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

所以从内部开始,我们想要计算非零分数的类数:

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

这表明第1,5类有多个分数&gt;所以我们从SELECT中返回count(*)并在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子句中再添加一个条件,这会产生上面的初始查询。