Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de count dans la clause where :utilisation invalide de la fonction de groupe

Vous ne pouvez utiliser que des fonctions d'agrégation comme COUNT() dans un HAVING clause, ou dans la SELECT clause lorsqu'un GROUP BY est utilisé. Le WHERE La clause fonctionne sur les lignes qui proviennent de FROM clause. Aucune agrégation n'a eu lieu, il n'y a donc aucun moyen pour les fonctions d'agrégation d'être significatives.

Il semble que ce que vous voulez faire est de trouver dans la table ENROLL tous les étudiants qui apparaissent plus d'une fois. Ensuite, vous voulez obtenir plus de détails sur ces étudiants. Il existe potentiellement de nombreuses façons de procéder, mais je recommanderais une sous-requête.

SELECT s.*
  FROM student AS s
  JOIN (
    SELECT e.sno
      FROM enroll AS e
     GROUP BY e.sno
    HAVING COUNT(*) > 1
  ) AS e
    ON e.sno = s.sno
 ORDER BY s.age DESC
 LIMIT 10

La sous-requête après JOIN fait ce premier calcul (dont les étudiants ont plusieurs lignes dans ENROLL) et produit essentiellement une pseudo-table avec une liste d'identifiants d'étudiants. Puisque nous faisons une jointure interne, seules les lignes de la table STUDENT qui ont un sno dans notre sous-requête apparaîtra. C'est essentiellement pris en charge par le ON clause.

Puisque vous avez dit dans un commentaire que vous souhaitiez pouvoir appliquer des conditions supplémentaires aux étudiants, j'ai ajouté un exemple de code où cela se produirait. Étant donné que ces informations proviennent de la table STUDENT, elles peuvent être effectuées en dehors de la sous-requête. Vous n'avez pas spécifiquement compris ce que signifient les "étudiants les plus âgés", donc j'ai juste supposé que vous vouliez que les 10 plus âgés soient inscrits à plusieurs cours. Vous devriez pouvoir vous adapter en fonction de vos besoins.

Faites-moi savoir si tout cela n'a pas de sens et j'essaierai d'expliquer plus en détail.