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


[Résolu] 3 requêtes SQL en une seule? - orditeck - 30-06-2010

Bonsoir!

Je développe actuellement une plateforme Access, et j'ai un peu de difficulté avec la conception d'une requête.

Je voudrais ces trois requêtes:
SELECT Identifiant, Analyse1, Analyse2, Analyse3
FROM Resultats

SELECT NumeroExigence
FROM Informations
WHERE Informations.IdentifiantResultats = Resultats.Identifiant

SELECT NumeroExigence, Exigence1, Exigence2, Exigence3
FROM Exigences
WHERE Exigences.NumeroExigence = Informations.NumeroExigences

En une seule. Je ne sais pas si c'est avec UNION, ou avec une sous-sélection...

Le but étant d'avoir un résultat comme voici:

Code :
-   Analyse1    -    Analyse2    -    Analyse3
-   Exigence1   -    Exigence2   -    Exigence3

et non

Code :
- Analyse1 - Analyse2 - Analyse3 - Exigence1 - Exigence2 - Exigence3

Je ne sais pas si je donne assez de détail...
Laissez moi savoir si ce que je dis est peu compréhensible!


RE: 3 requêtes SQL en une seule? - php_addict - 30-06-2010

euh...as tu essayé avec JOIN? (LEFT OU INNER) ?

si tes tables sont liées alors tu devrais y arriver non ???

essaye les jointure UNION et fais un <?php print_r($resultats); ?>


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

Salut,

petit rappel d'SQL: un UNION ne peut regrouper que des requetes ayant le meme nombre de champs en sortie et surtout ayant respectivement la meme structure de donnée (meme type).
On fait l'union d'un INT avec un VARCHAR... logique non? ^^

Donc là je pense pas que l'UNION fait la force (oui oui c'était nul comme blague)


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

J'aurais pensé à quelque chose comme :
SELECT 
Resultats.Analyse1,
Resultats.Analyse2,
Resultats.Analyse3
FROM Resultats
JOIN Informations
ON Informations.IdentifiantResultats = Resultats.Identifiant
JOIN Exigences
ON Exigences.NumeroExigence = Informations.NumeroExigences
UNION
SELECT
Exigences.Exigence1,
Exigences.Exigence2,
Exigences.Exigence3
FROM Resultats
JOIN Informations
ON Informations.IdentifiantResultats = Resultats.Identifiant
JOIN Exigences
ON Exigences.NumeroExigence = Informations.NumeroExigences



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

elle me parait bien compliqué ta requete (je suis pas expert) mais ne serait t il pas plus simple de repensé la structure de tes tables?


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

C'est quand même une demande particulière de vouloir sur deux occurrences les informations pouvant être disponible sur une seule!

La solution de _who pourrait marcher à condition de rajouter une clause where restrictive pour ne remonter qu'un seul tuple à la fois (where Resultats.Identifiant=xxx)

Dans le cas contraire, tu vas obtenir par exemple:
Code :
-   Analyse1    -    Analyse2    -    Analyse3 (pour Resultats.Identifiant=1)
-   Analyse1    -    Analyse2    -    Analyse3 (pour Resultats.Identifiant=2)
-   Analyse1    -    Analyse2    -    Analyse3 (pour Resultats.Identifiant=3)
-   Analyse1    -    Analyse2    -    Analyse3 (pour Resultats.Identifiant=4)
-   Exigence1   -    Exigence2   -    Exigence3 (pour Resultats.Identifiant=1)
-   Exigence1   -    Exigence2   -    Exigence3 (pour Resultats.Identifiant=2)
-   Exigence1   -    Exigence2   -    Exigence3 (pour Resultats.Identifiant=2)
-   Exigence1   -    Exigence2   -    Exigence3 (pour Resultats.Identifiant=3)
-   Exigence1   -    Exigence2   -    Exigence3 (pour Resultats.Identifiant=4)
-   Exigence1   -    Exigence2   -    Exigence3 (pour Resultats.Identifiant=4)

A tout hasard, aller faire un tour du coté des vues ou des procédures stockées pourrait fournir une alternative satisfaisante.


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

Le résultat demandé est un résultat du type "colonne" alors que les SGBD donnent des résultats de type ligne, donnez lui une requête qui fait :
Code :
-   Analyse1   -    Exigence1
-   Analyse2   -    Exigence2
-   Analyse3   -    Exigence3

La requête est bien plus simple et retourner ce type de résultat au format "colonne" est super simple en programmation.


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

J'ai oublié de préciser que cette requête n'affichera qu'une série de donnée venant de la table Resultats, et deux séries de données (de 2 SELECT différents) venant de la table Exigences. (Je sais que je n'ai demandé qu'une série de donnée pour la table Exigences dans mon premier post. Je ne voulais pas vous donner trop d'informations impertinentes. Une fois la première faite, je serai amplement capable de faire la deuxième, ce ne sera quasiment qu'un vulgaire copier/coller...!)

(01-07-2010, 09:35 AM)oxman a écrit : Le résultat demandé est un résultat du type "colonne" alors que les SGBD donnent des résultats de type ligne, donnez lui une requête qui fait :
Code :
-   Analyse1   -    Exigence1
-   Analyse2   -    Exigence2
-   Analyse3   -    Exigence3

La requête est bien plus simple et retourner ce type de résultat au format "colonne" est super simple en programmation.

Ce serait plus facile, en effet, mais ce n'est pas ce que je recherche.
La méthode pour faire des graphiques dans Access est tellement bâclée qu'il devient vite difficile d'arriver à nos fin. De plus, les nuages de points XY sont les plus compliqués à reproduire, et c'est comme par hasard exactement ce que j'ai à faire...!

Sur mon graphique, je dois afficher une première courbe (les résultats d'une analyse granulométrique avec échelle logarithmique) avec 14 points.
Cependant, je dois afficher une deuxième courbe (les exigences minimums), avec un nombre de point entre 1 et 14.
Enfin, je dois afficher une dernière courbe (les exigences maximum, cette fois), toujours avec un nombre de point variable.

Lorsque je n'affiche que ma première courbe, tout fonctionne. J'ai réussi, avec des SELECT C112 AS 112, à recevoir des résultats comme:
(si je ne met pas de AS 112, dans la première ligne j'ai des C112, C80, C56, .... qui ne sont pas insérable numériquement dans un nuage de point.
Code :
112    80     56      31,5     28      20      14      10      5   ...
                                                84       64      7       2

De ce côté, tout fonctionne parfaitement. Maintenant, ce qu'il me faut, c'est :
Code :
L1  112    80     56      31,5     28      20      14      10      5
L2                                                84       64      7       2
L3  112    80     56      31,5     28      20      14      10      5
L4                                                90       70      5       1
L5  112    80     56      31,5     28      20      14      10      5
L6                                                100     80      10      4

L4 étant les résultats de la table Exigences quand je sélectionne mes exigences minimum, et L6 étant les résultats de la table Exigences quand je sélectionne mes exigences maximums.

Les exigences sont sélectionnés à partir du numéro d'exigence qui se trouve dans la table Information.
Les informations sont sélectionnés à partir du numéro d'analyse qui se trouve dans la table Analyse.

Voilà! Je rentre au boulot sous peu, je vous tiendrai au courant de l'avancement.


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

A 3h30, faut pas me demander des miracles !

Comme ox, j'aurais plutôt choisi une solution algorithmique mais le choix d'une requête semblait plus que fortement souhaité ^^


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

(01-07-2010, 01:06 PM)orditeck a écrit : De ce côté, tout fonctionne parfaitement. Maintenant, ce qu'il me faut, c'est :
Code :
L1  112    80     56      31,5     28      20      14      10      5
L2                                                84       64      7       2
L3  112    80     56      31,5     28      20      14      10      5
L4                                                90       70      5       1
L5  112    80     56      31,5     28      20      14      10      5
L6                                                100     80      10      4
Présenté de cette manière je ne vois pas solution simple à mettre en oeuvre autre qu'une UNION de SELECT.
Du moment que tu possèdes les SELECT pour obtenir individuellement L1, L2, L4 et L6, tu construits ton UNION en tenant compte des contraintes qu'impose cette syntaxe (nombre et type des colonnes).

Une autre solution pourrait être une préparation des données dans une table tampon; du coup plus de soucis pour les obtenir via Access mais se pose alors la question du remplissage de cette table.