Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pierwsze trzy grupy z najwyższymi ocenami powinny mieć określone punkty

To było wyzwanie.

Aby go rozwiązać, użyłem kilku metod:

  1. oświadczenie CASE zamienić miejsce grupy w pierwszej trójce na punkty.
  2. Numeracja wierszy ze zmienną .
  3. WEWNĘTRZNA I W LEWO DOŁĄCZ scalić wyniki razem.

Poniższe zapytanie zostało przetestowane na Twoich skrzypcach i działa:

SELECT t1.`id`,  t1.`name`,  t1.`group1`,
       t1.`section`, t1.`MARKS`, `t_group_points`.`points`

FROM   `students` t1

#--- Join  groups' points to the students
LEFT JOIN (
    (
        #---- Join all groups and give points to top 3 avg's groups ----
        SELECT `t4`.`group1`, `t_points`.`points`
        FROM   (SELECT   `t3`.`group1`, AVG(`t3`.`marks`) AS `avg`
                FROM     `students` `t3`
                WHERE    (`t3`.`section` = 'class1') AND
                         (`t3`.`group1` IS NOT NULL)
                GROUP BY `t3`.`group1`) `t4`

        INNER JOIN (
              #---------- Select top 3 avarages ----------
              (SELECT `top`.`avg`,
                      #-- Convert row number to points ---
                      CASE @curRow := @curRow + 1  
                           WHEN '1' THEN 5
                           WHEN '2' THEN 3
                           WHEN '3' THEN 1
                           ELSE NULL END 'points'

              FROM (SELECT DISTINCT `t_avg`.`avg`
                    FROM   (SELECT   `t2`.`group1`, AVG(`t2`.`marks`) AS `avg`
                            FROM     `students` `t2`
                            WHERE    (`t2`.`section` = 'class1') AND
                                     (`t2`.`group1` IS NOT NULL)
                            GROUP BY `group1`) `t_avg`
                    ORDER BY `avg` DESC
                    LIMIT 0, 3) `top`, (SELECT @curRow:=0) r
              ) AS `t_points`)
         ON (`t_points`.`avg` = `t4`.`avg`)      
    ) AS `t_group_points`)
ON (`t_group_points`.`group1` = `t1`.`group1`)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Powolne zapytanie w wynikach wyszukiwania na podstawie lokalizacji

  2. Wydajność MySQL:MySQL kontra MariaDB

  3. Warunkowe wstawianie MySQL

  4. wstaw, jeśli nie istnieje, po prostu wybierz w mysql

  5. Używanie backquote/backticks dla zapytań mysql