Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 15h47   #1
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 133
Points : 38
Points : 38
Par défaut Soustraction de résultats de deux requêtes

Bonjour,

j'ai un petit problème avec une soustraction de résultats de deux requêtes...
je ne souhaite pas faire une soustraction basique sur deux champs de tables différentes (par exemple "SELECT champ1.t1-champ2.t2 etc"..), mais une soustraction sur des résultats calculés

Grosso-modo, j'ai deux requêtes :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
SELECT count( * ) AS NB1, b2722_data.`Ordre_2` AS TYPE1
FROM b2717_data
LEFT JOIN b2722_data ON b2717_data.`Type_2` = b2722_data.`id`
GROUP BY TYPE1;
 
Me retourne quelque chose du genre :
NB1    TYPE1
4           1
4           2
4           3
 
 
 
Et ma deuxième requête :
 
SELECT count( * ) AS NB2, b2722_data.`Ordre_2` AS TYPE2
FROM b2717_data
LEFT JOIN b2722_data ON b2717_data.`Type_2` = b2722_data.`Ordre_2`
LEFT JOIN b2720_data ON b2720_data.`Meuble_2` = b2717_data.`id` 
LEFT JOIN b2719_data ON b2720_data.`Reservation_1` = b2719_data.`id` 
WHERE b2719_data.`Periode_du_2`>="2011-05-20" AND b2719_data.`Periode_au_3`<=DATE_ADD("2011-06-15", INTERVAL 10 DAY )
GROUP BY TYPE2; 
 
 
Me retourne quelque chose comme :
NB2    TYPE2
2         1
           2
1         3

Là où je coince, c'est que j'aimerai pouvoir soustraire chaque ligne entre elle... pour bien me faire comprendre, il me faudrait quelque chose comme ceci :
Code :
1
2
3
4
5
 
NB1-NB2        TYPE1
2                    1
4                    2
3                    3

Je pensais mettre les deux résultats de mes deux requêtes dans deux tables temporaires TMP1 et TMP2 (pour ensuite faire une soustraction de type SELECT (NB1.TMP1-NB2.TMP2),TYPE1.TMP1...), mais je n'ai pas le droit d'utiliser de tables temporaires..

Une solution ? Merci beaucoup
ganguill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 10h54   #2
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 208
Points : 1 208
Et comme ça, ça ne peux pas fonctionner?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT
	rq1.NB1 - rq2.NB2 AS 'NB1 - NB2',
	rq1.TYPE1
FROM
(
	SELECT 
		count( * ) AS NB1, 
		b2722_data.`Ordre_2` AS TYPE1
	FROM b2717_data
		LEFT JOIN b2722_data 
			ON b2717_data.`Type_2` = b2722_data.`id`
	GROUP BY TYPE1
) rq1, (
	SELECT 
		count( * ) AS NB2, 
		b2722_data.`Ordre_2` AS TYPE2
	FROM b2717_data
		LEFT JOIN b2722_data 
			ON b2717_data.`Type_2` = b2722_data.`Ordre_2`
		LEFT JOIN b2720_data 
			ON b2720_data.`Meuble_2` = b2717_data.`id` 
		LEFT JOIN b2719_data 
			ON b2720_data.`Reservation_1` = b2719_data.`id` 
	WHERE b2719_data.`Periode_du_2`>="2011-05-20" AND 
		b2719_data.`Periode_au_3`<=DATE_ADD("2011-06-15", INTERVAL 10 DAY )
	GROUP BY TYPE2
) rq2;
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 16h05   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
kain_tn, en écrivant les jointures selon la norme en vigueur depuis 1992 avec l'opérateur JOIN, tu te serais rendu compte que ta requête ne comporte pas de condition de jointure, ce qui revient à faire un produit cartésien entre les deux sous_requêtes !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT
    rq1.NB1 - rq2.NB2 AS 'NB1 - NB2',
    rq1.TYPE1
FROM
(
    SELECT 
        count( * ) AS NB1, 
        b2722_data.`Ordre_2` AS TYPE1
    FROM b2717_data
        LEFT JOIN b2722_data 
            ON b2717_data.`Type_2` = b2722_data.`id`
    GROUP BY TYPE1
) rq1
INNER JOIN 
(
    SELECT 
        count( * ) AS NB2, 
        b2722_data.`Ordre_2` AS TYPE2
    FROM b2717_data
        LEFT JOIN b2722_data 
            ON b2717_data.`Type_2` = b2722_data.`Ordre_2`
        LEFT JOIN b2720_data 
            ON b2720_data.`Meuble_2` = b2717_data.`id` 
        LEFT JOIN b2719_data 
            ON b2720_data.`Reservation_1` = b2719_data.`id` 
    WHERE b2719_data.`Periode_du_2`>="2011-05-20" AND 
        b2719_data.`Periode_au_3`<=DATE_ADD("2011-06-15", INTERVAL 10 DAY )
    GROUP BY TYPE2
) rq2 ON rq2.TYPE2 = rq1.TYPE1
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 10h29   #4
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 208
Points : 1 208
Argh! mea culpa
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h45.


 
 
 
 
Partenaires

Hébergement Web