Problème de requête [IMPORTANT]

Résolu
pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 - 28 juin 2006 à 12:30
pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 - 3 juil. 2006 à 12:02
Bonjour à tous,

Ca serait vraiment super si vous pouviez m'aider !

Comment faire pour qu'on récupère un enregistrement qui est NULL, je m'explique :

Je fais un SELECT sur le champ T1.A de la table T1 et je JOIN la table T2 et je fais un SUM(T2.B)
Donc pour faire la jointure je dois mettre après le WHERE => T2.id_t1 = T1.id (par exemple)

La il va me sortir tous les enregistrements donc l'ID de T1 correspondra au champ ID_T1 de la table T2, on est d'accord.

Mais ce que je voudrais, c'est qu'il me sorte TOUS les enregistrements de la table T1 et que si T2.id_t1 = T1.id ALORS il me fait le calcule par SUM() !

J'espère avoir été assez clair :x

En gros ca devrait donner un truc dans ce genre :

SELECT T1.*, SUM(T2.B) FROM T1,T2 WHERE T1.id = T2.id_T1 OR T1.id != T2.id_T1;

Mais bon bien sûr, ça marche pas.

Je galère trop, j'espère que vous pouvez m'aider !

Bye et merci d'avance

7 réponses

pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 1
3 juil. 2006 à 12:02
Bon ça y est ! Après moulte et moulte recherches, j'ai trouvé la solution ! Je la poste quand même pour ceux qui seraient dans le même cas que moi :

Il faut utiliser les jointures externes alias LEFT OUTER JOIN afin de pouvoir afficher tous les resultats de la table de gauche même s'ils ne remplissent pas la condition dans le "ON".

Cependant, j'ai eu un soucis avec ça, c'est que ma requête était TRES longue !
La solution : les INDEX ! :)

Créer les index là où MySQL devra chercher, je suis passé de 4,4s à 0,0018s :p

Bye
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 juin 2006 à 12:38
Hello,

si tu peux faire des sous-requêtes, alors :
SELECT
   T1.id,
   (SELECT SUM(T2.B) FROM T2 WHERE T2.id = T1.id) as somme
FROM 
   T1

Je pense que ça devrait fonctionner.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 juin 2006 à 12:40
Ou bien sans doute :

 SELECT
  T1.id,
  COALESCE (SUM (T2.B), NULL, 0) AS somme
 FROM
    T1  
      JOIN T2 ON T2.id = T1.id
0
pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 1
28 juin 2006 à 13:23
Merci malalam de m'avoir répondu,

Je vais tester ça cet après midi, je te dirais si ça passe :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 1
28 juin 2006 à 14:45
Bon alors, j'ai testé avec les 2 :

La première, ça marche pas, ça affiche pas ce que je veux :x
La deuxième, c'est le bon truc, seulement ça n'affiche quand même pas les lignes NULL :x

En fait, je sais pas si je me suis bien expliqué :
Je voudrais que MySQL me retourne un truc comme ça :
SELECT T1.*, sum(T2.B), T3.* FROM T1,T2,T3 WHERE T1.id T2.id_t1 AND T2.id T3.id_t2 AND T3.id = "un nombre";

Imaginons que la requête est retournée avec ces valeurs :

ligne 1 => 1 - 10500 - 35
ligne 2 => 2 - 568 - 35
ligne 3 => 3 - 825 - 35
ligne 4 => 4 - 0 - 35

Et la à la ligne 4, je veux qu'il me retourne la ligne même si T2.id n'est PAS égal à T3.id_t2 :x

Si A = B on affiche la somme sinon on affiche quand même la ligne mais avec une valeur de somme égale à 0 :x

C'est possible de faire ça sous MySQL ? Dites moi que oui... :x
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
28 juin 2006 à 15:02
SELECT
CASE WHEN ( T2.id_t1 = T1.id ) THEN SUM(T2.B)
FROM
T1, T2


Te sortira tes SUM seulement si T2.idt1 = T1.id sinon retourne NULL.
0
pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 1
28 juin 2006 à 18:04
Merci FhX,

J'ai testé ta solution et ça avait l'air de marcher ! Mais mon serveur MySQL tourne dans le vide :x

Voilà ma requête au complet :

Je sélectionne via un formulaire une région puis je poste =>

// Je stock dans une variable les champs dont j'ai besoin à exporter
$champs =  'CASE WHEN ( clients_contrats.Ref_Chantier = archis_chantiers.id ) THEN SUM(clients_contrats.Tarif) ELSE "0" END,
            archis_fiches.nom,
            DATE_FORMAT(archis_dossiers.dvisit, "%d/%m/%y") AS dvisit,
            archis_dossiers.code,
            archis_dossiers.commercial,
            archis_fiches.tel1,
            archis_fiches.fax,
            archis_fiches.email';
           
// Maintenant la requête SQL$sql 'SELECT '.$champs.' FROM archis_dossiers, archis_fiches, archis_chantiers, clients_contrats WHERE archis_fiches.id archis_dossiers.id_archi AND archis_fiches.region = "'.$_POST['region'].'" AND archis_chantiers.id_dossier = archis_dossiers.id GROUP BY archis_dossiers.code, archis_dossiers.id ORDER BY archis_fiches.nom';

// Ici j'appelle une fonction qui execute la requete et la stock dans un fichier excel
echo mysql_excel_color($sql,'Archi_Region_'.str_replace('','-',substr($_POST['region'],0,3)),'2');

Il y a une centaine d'enregistrements à renvoyés environs.

Franchement si vous pouviez me dire où ça coince, vous aurez ma gratitude éternelle ! (^^)

Bye et merci de prendre le temps de m'aider !
0
Rejoignez-nous