J'ai une requête que j'exécutit avec Microsoft SQL Server et cela a bien fonctionné. Il a utilisé des CTES parce que j'ai rejoint trois tables. Les deux premiers dans une requête interne puis externe. Cependant, lorsque j'ai essayé cela sur mon serveur Web, il n'a que MySQL installé et je ne pouvais pas exécuter la requête. Y a-t-il un moyen de faire fonctionner une requête avec cette structure? Voici un échantillon:
USE UNAMupdates;
with CTE as
( SELECT tbl_modules.module_code
FROM tbl_student
JOIN tbl_modules ON tbl_student.registration_year = tbl_modules.registration_year
WHERE tbl_student.student_number='1002')
SELECT tbl_notifications.module_name,tbl_notifications.message,tbl_notifications.staff_username,tbl_notifications.date_time
FROM CTE JOIN tbl_notifications
ON cte.module_code = tbl_notifications.module_code
ORDER BY tbl_notifications.date_time DESC
[.
Dans ce cas particulier, le CTE pourrait être remplacé par un sous-sélection normal (une table dérivée):
SELECT
tbl_notifications.module_name,
tbl_notifications.message,
tbl_notifications.staff_username,
tbl_notifications.date_time
FROM
(
SELECT
tbl_modules.module_code
FROM
tbl_student
INNER JOIN tbl_modules ON tbl_student.registration_year = tbl_modules.registration_year
WHERE
tbl_student.student_number = '1002'
) AS CTE
INNER JOIN tbl_notifications ON cte.module_code = tbl_notifications.module_code
ORDER BY
tbl_notifications.date_time DESC
;
Et cette requête fonctionnerait à la fois dans SQL Server et MySQL (dans n'importe quel produit SQL majeur, en fait).
De plus, la nidification est inutile ici du tout, et vous pourriez donc avoir le même résultat avec ce qui suit:
SELECT
tbl_notifications.module_name,
tbl_notifications.message,
tbl_notifications.staff_username,
tbl_notifications.date_time
FROM
tbl_student
INNER JOIN tbl_modules ON tbl_student.registration_year = tbl_modules.registration_year
INNER JOIN tbl_notifications ON tbl_modules.module_code = tbl_notifications.module_code
WHERE
tbl_student.student_number = '1002'
ORDER BY
tbl_notifications.date_time DESC
;
Et au fait, veuillez envisager d'utiliser des alias de table courts dans vos questions. Voici à quoi ressemble la même requête avec de courts alias:
SELECT
n.module_name,
n.message,
n.staff_username,
n.date_time
FROM
tbl_student AS s
INNER JOIN tbl_modules AS m ON s.registration_year = m.registration_year
INNER JOIN tbl_notifications AS n ON m.module_code = n.module_code
WHERE
s.student_number = '1002'
ORDER BY
n.date_time DESC
;
Cela peut être subjectif parfois, mais je crois que dans cette affaire la lisibilité s'améliore grandement.