JeuWeb - Crée ton jeu par navigateur
[Résolu] 3 requêtes SQL en une seule? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] 3 requêtes SQL en une seule? (/showthread.php?tid=4956)

Pages : 1 2


RE: 3 requêtes SQL en une seule? - Ter Rowan - 01-07-2010

hum en mettant un alias sur les retours de la requête de _who, en y intégrant en plus "Identifiant" et "origine", orgine ayant deux sources possibles valeur = 1 pour les données de la table résultat et 2 pour les données de la table exigences

tu vas obtenir un résultat du type :

identifiant orginie col1 col2 col3 col4 ....



de la tu fais une seconde requête basée sur le résultat de la première (si tu es en access c'est natif, enfin ça l'était sur les versions que j'ai utilisées il y a quelques années) ou éventuellement tu fais une requete qui intègre celle de who :

select col1 col2 .... from leRestultatDeLaRequeteDe_who order by identifiant, origine


du coup tu as la requête qui t'organise les données (la mienne)
et celle qui génère les données, celle de _who
l'intérêt de séparer les deux, c'est que tu peux casser l'extracteur de données (rajouté autre chose que des exigences, etc...) sans pour autant modifier ta requête de "restitution"


RE: 3 requêtes SQL en une seule? - orditeck - 01-07-2010

J'aurais une erreur SQL autour du premier FROM.... mais je ne la vois pas.


SELECT
Granulos.C20 AS 20,
Granulos.C14 AS 14,
Granulos.C10 AS 10
FROM tblGranulatsResultats
AS Granulos
JOIN tblGranulatInfos
AS J1Infos
ON J1Infos.analyse = 1 // temporaire, pour les tests
JOIN tblGranulatExigences
AS J1Exigences
ON J1Exigences.ID_Exigence = J1Infos.Exig_No
UNION
SELECT
Exigences.EX20MIN,
Exigences.EX14MIN,
Exigences.EX10MIN
FROM tblGranulatExigences
AS Exigences
JOIN tblGranulatInfos
AS J2Infos
ON J2Infos.analyse = 1 // temporaire, pour les tests
JOIN tblGranulatExigences
AS J2Exigences
ON J2Exigences.ID_Exigence = J2Infos.Exig_No

Peut être sauriez-vous la trouver mieux que moi!


RE: 3 requêtes SQL en une seule? - Ter Rowan - 01-07-2010

attention tu es sous access, donc la version sql est... particulière

vérifie qu'il connaisse "join", ou mieux, voit comment il fait une jointure


RE: 3 requêtes SQL en une seule? - orditeck - 01-07-2010

(01-07-2010, 04:44 PM)Ter Rowan a écrit : attention tu es sous access, donc la version sql est... particulière

vérifie qu'il connaisse "join", ou mieux, voit comment il fait une jointure

Merci du conseil, j'ai beaucoup de notes sur Access et il prend effectivement UNION et JOIN.
MySQL, de son côté, me retourne
Code :
#1064 - You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use
near '20, Granulos.C14 AS 14, Granulos.C10 AS 10 FROM tblGranulatsResultats AS Granulo'
at line 1



RE: 3 requêtes SQL en une seule? - Ter Rowan - 01-07-2010

arf alors des idées comme ça

est ce que l'alias numérique est possible sous mysql parce que finalement même si ça marche sous access rien ne dit que ça marche sous mysql et du coup l'erreur est peut être ailleurs

j'avais fait un paquet de requete avec access, la première chose à faire est de se dire que ce n'est pas de l'informatique (même si, au final ça en est) je ne peux donc que te conseiller de réaliser tes requêtes en étant guidé par access (ie tu prends son éditeur , tu sélectionne tes champs, etc...) et après que chaque requête fonctionne, construis une requête union via sql en copiant collant les deux requêtes.

sinon concernant la requête (mais je me trompe peut être)
Code :
SELECT
       Granulos.C20 AS 20,
       Granulos.C14 AS 14,
       Granulos.C10 AS 10
FROM tblGranulatsResultats
     AS Granulos
JOIN tblGranulatInfos
     AS J1Infos
     ON J1Infos.analyse = 1 // temporaire, pour les tests
JOIN tblGranulatExigences
     AS J1Exigences
     ON J1Exigences.ID_Exigence = J1Infos.Exig_No

à quoi sert le dernier join (tblGranulatExigences) ? tel que je le vois tu vas ramener autant de ligne C20/C14/C10 qu'il y a d'enregistrements exigences pour analyse = 1 alors que la jointure granulos j1Infos devrait suffire


Code :
UNION
SELECT
       Exigences.EX20MIN,
       Exigences.EX14MIN,
       Exigences.EX10MIN
FROM tblGranulatExigences
     AS Exigences
JOIN tblGranulatInfos
     AS J2Infos
     ON J2Infos.analyse = 1 // temporaire, pour les tests
JOIN tblGranulatExigences
     AS J2Exigences
     ON J2Exigences.ID_Exigence = J2Infos.Exig_No
même truc à quoi sert la dernière jointure ? pourquoi ne pas faire la jointure entre Exigences et J2Infos, pas besoin de J2Exigences non ?
n'oublie pas de mettre les mêmes alias (20 14 10) dans cette seconde partie


RE: 3 requêtes SQL en une seule? - orditeck - 01-07-2010

(01-07-2010, 05:18 PM)Ter Rowan a écrit : est ce que l'alias numérique est possible sous mysql parce que finalement même si ça marche sous access rien ne dit que ça marche sous mysql et du coup l'erreur est peut être ailleurs

En effet, c'était le problème pour MySQL. Access me renvoie encore un erreur à propos d'un FROM, sans donner plus de détails! Mais pour sa part, Access prend les alias numérique.

(01-07-2010, 05:18 PM)Ter Rowan a écrit : j'avais fait un paquet de requete avec access, la première chose à faire est de se dire que ce n'est pas de l'informatique (même si, au final ça en est) je ne peux donc que te conseiller de réaliser tes requêtes en étant guidé par access (ie tu prends son éditeur , tu sélectionne tes champs, etc...) et après que chaque requête fonctionne, construis une requête union via sql en copiant collant les deux requêtes.

Très bonne idée.. je n'y avais même pas pensé tellement Access est chiant à utiliser Tongue

(01-07-2010, 05:18 PM)Ter Rowan a écrit : sinon concernant la requête (mais je me trompe peut être)
Code :
SELECT
       Granulos.C20 AS 20,
       Granulos.C14 AS 14,
       Granulos.C10 AS 10
FROM tblGranulatsResultats
     AS Granulos
JOIN tblGranulatInfos
     AS J1Infos
     ON J1Infos.analyse = 1 // temporaire, pour les tests
JOIN tblGranulatExigences
     AS J1Exigences
     ON J1Exigences.ID_Exigence = J1Infos.Exig_No

à quoi sert le dernier join (tblGranulatExigences) ? tel que je le vois tu vas ramener autant de ligne C20/C14/C10 qu'il y a d'enregistrements exigences pour analyse = 1 alors que la jointure granulos j1Infos devrait suffire


Code :
UNION
SELECT
       Exigences.EX20MIN,
       Exigences.EX14MIN,
       Exigences.EX10MIN
FROM tblGranulatExigences
     AS Exigences
JOIN tblGranulatInfos
     AS J2Infos
     ON J2Infos.analyse = 1 // temporaire, pour les tests
JOIN tblGranulatExigences
     AS J2Exigences
     ON J2Exigences.ID_Exigence = J2Infos.Exig_No
même truc à quoi sert la dernière jointure ? pourquoi ne pas faire la jointure entre Exigences et J2Infos, pas besoin de J2Exigences non ?

Hum, je ne suis pas certain de te suivre.
Je dois d'abord interroger Infos pour avoir le # d'exigence, et ensuite aller chercher les données de ladite exigence à l'aide de ce numéro.

(01-07-2010, 05:18 PM)Ter Rowan a écrit : n'oublie pas de mettre les mêmes alias (20 14 10) dans cette seconde partie

Ça je ne l'oublierai pas c'est sur! Mais je veux d'abord que la requête fonctionne Tongue


RE: 3 requêtes SQL en une seule? - Ter Rowan - 01-07-2010

je reprend dans la partie 1 de l'union

le select sert a ramener des données de tblGranulatsResultats du coup, (mais je ne connais pas le modèle)

soit il manque une jointure entre tblGranulatsResultats et tblGranulatInfos (et dans ce cas la jointure avec tblGranulatExigences ne sert probablement à rien ? filtre supplémentaire ?)

soit il manque une jointure entre tblGranulatsResultats et tblGranulatExigences


de même dans la deuxième requete tu fais une jointure sur

tblGranulatExigences
tblGranulatInfos
tblGranulatExigences

par contre il n'y a aucune clause entre le premier tblGranulatExigences et les deux autres tables (dont une seconde fois tblGranulatExigences ) du coup tu vas te retrouver avec plein de fois le contenu de tblGranulatExigences

après je suis pas sûr d être clair (la journée fut dure) et je suis loin d être expert donc mes mots ne sont pas forcément les bons
concernant le n'oublie pas des alias, ton union ne pourra pas marcher je le crains sans les alias, c'est pas juste pour le côté esthétique que je disais cela


RE: 3 requêtes SQL en une seule? - orditeck - 01-07-2010

(01-07-2010, 05:52 PM)Ter Rowan a écrit : soit il manque une jointure entre tblGranulatsResultats et tblGranulatInfos (et dans ce cas la jointure avec tblGranulatExigences ne sert probablement à rien ? filtre supplémentaire ?)

soit il manque une jointure entre tblGranulatsResultats et tblGranulatExigences

Pour faire un lien entre tblGranulatsResultats et tblGranulatExigences, je dois passer par tblGranulatInfos (voir premier post)

Cependant, pour la deuxième requête, je crois également qu'un seul JOIN suffit, donc:

SELECT
Exigences.EX20MIN,
Exigences.EX14MIN,
Exigences.EX10MIN
FROM tblGranulatExigences
AS Exigences
JOIN tblGranulatInfos
AS J2Infos
ON J2Infos.analyse = 1

(01-07-2010, 05:52 PM)Ter Rowan a écrit : concernant le n'oublie pas des alias, ton union ne pourra pas marcher je le crains sans les alias, c'est pas juste pour le côté esthétique que je disais cela

Oui, j'avais compris. Mais encore faudrait-il que ma requête fonctionne syntaxiquement avant...


RE: 3 requêtes SQL en une seule? - orditeck - 01-07-2010

Je crois bien avoir réussi ma requête! (ça reste à confirmer)

Voilà de quoi elle a l'air:

SELECT 
Granulos.C112 AS 112,
Granulos.C80 AS 80,
Granulos.C56 AS 56,
Granulos.C40 AS 40,
Granulos.C31_5 AS [31,5],
Granulos.C28 AS 28,
Granulos.C20 AS 20,
Granulos.C14 AS 14,
Granulos.C10 AS 10,
Granulos.C5 AS 5,
Granulos.C2_5 AS [2,5],
Granulos.C1_25 AS [1,25],
Granulos.C630 AS [0,630],
Granulos.C315 AS [0,315],
Granulos.C160 AS [0,160],
Granulos.C80m AS [0,080]
FROM
tblGranulatsResultats AS Granulos
INNER JOIN
tblGranulatInfos AS J1Infos
ON J1Infos.analyse = Granulos.analyse
WHERE
Granulos.analyse = 1
UNION
SELECT
Exigences.EX112MIN AS 112,
Exigences.EX80MIN AS 80,
Exigences.EX56MIN AS 56,
Exigences.EX40MIN AS 40,
Exigences.EX31_5MIN AS [31,5],
Exigences.EX28MIN AS 28,
Exigences.EX20MIN AS 20,
Exigences.EX14MIN AS 14,
Exigences.EX10MIN AS 10,
Exigences.EX5MIN AS 5,
Exigences.EX2_5MIN AS [2,5],
Exigences.EX1_25MIN AS [1,25],
Exigences.EX630MIN AS [0,630],
Exigences.EX315MIN AS [0,315],
Exigences.EX160MIN AS [0,160],
Exigences.EX80MMIN AS [0,080]
FROM
tblGranulatExigences AS Exigences,
tblGranulatsResultats AS Granulos
INNER JOIN
tblGranulatInfos AS J2Infos
ON J2Infos.analyse = Granulos.analyse
WHERE
Exigences.ID_Exigence = J2Infos.Exig_No
AND
Granulos.analyse = 1
UNION
SELECT
Exigences.EX112MAX AS 112,
Exigences.EX80MAX AS 80,
Exigences.EX56MAX AS 56,
Exigences.EX40MAX AS 40,
Exigences.EX31_5MAX AS [31,5],
Exigences.EX28MAX AS 28,
Exigences.EX20MAX AS 20,
Exigences.EX14MAX AS 14,
Exigences.EX10MAX AS 10,
Exigences.EX5MAX AS 5,
Exigences.EX2_5MAX AS [2,5],
Exigences.EX1_25MAX AS [1,25],
Exigences.EX630MAX AS [0,630],
Exigences.EX315MAX AS [0,315],
Exigences.EX160MAX AS [0,160],
Exigences.EX80MMAX AS [0,080]
FROM
tblGranulatExigences AS Exigences,
tblGranulatsResultats AS Granulos
INNER JOIN
tblGranulatInfos AS J2Infos
ON J2Infos.analyse = Granulos.analyse
WHERE
Exigences.ID_Exigence = J2Infos.Exig_No
AND
Granulos.analyse = 1

Merci beaucoup à vous!!!!!