簡體   English   中英

根據出現率和另一列中的值選擇mysql列

[英]select mysql column based on occurrence and value in another column

做過研究,但仍然遇到麻煩

假設我有桌子

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的類進行計數,但是Im是一個相對初學者,必須缺少一些簡單的東西。

處理此查詢的一種標准方法是使用具有條件聚合的子查詢來確定哪些班級有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
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;

這將為您工作:

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

這是您的數據的功能示例

因此,從內部開始,我們要計算非零分數的類數:

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

這向您顯示1、5類具有不止一個得分大於0的類。因此,我們從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子句中再添加一個條件,這將導致上面的初始查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM