Primo quesito:
Non hai specificato il database. Con alcuni database puoi evitare ripetizione di subquery in questo modo:
codice:
WITH blah
AS (SELECT c1.codice,
Count(*) AS countIscrittiPerCorso
FROM corso c1
JOIN mailing_list m1
ON m1.codcorso = c1.codice
JOIN studente s1
ON s1.email = m1.emailstudente
GROUP BY c1.codice)
SELECT codice,
nome
FROM corso
WHERE anno = 3
AND codice IN (SELECT codice
FROM blah
WHERE countiscrittipercorso =
(SELECT Max(countiscrittipercorso)
FROM blah))
Per i database che non supportano 'with' devi ripetere la subquery:
codice:
FROM corso
WHERE anno = 3
AND codice IN (SELECT codice
FROM (SELECT c1.codice,
Count(*) AS countIscrittiPerCorso
FROM corso c1
JOIN mailing_list m1
ON m1.codcorso = c1.codice
JOIN studente s1
ON s1.email = m1.emailstudente
GROUP BY c1.codice) AS blah
WHERE blah.countiscrittipercorso =
(SELECT
Count(c.codice)
FROM corso c
JOIN
mailing_list m
ON
m.codcorso =
c.codice
JOIN studente s
ON
s.email = m.emailstudente
GROUP BY c.codice
ORDER BY Count(c.codice)
DESC
LIMIT 1))
MySQL standard non supporta "with" ma MariaDB, Oracle e altri si'.
Queste query le ho scritte molto velocemente perche' devo cenare.