pcgpegase
Messages postés96Date d'inscriptionlundi 24 novembre 2003StatutMembreDernière intervention24 avril 2007
-
28 juin 2006 à 12:30
pcgpegase
Messages postés96Date d'inscriptionlundi 24 novembre 2003StatutMembreDernière intervention24 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 !
pcgpegase
Messages postés96Date d'inscriptionlundi 24 novembre 2003StatutMembreDernière intervention24 avril 20071 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
pcgpegase
Messages postés96Date d'inscriptionlundi 24 novembre 2003StatutMembreDernière intervention24 avril 20071 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
pcgpegase
Messages postés96Date d'inscriptionlundi 24 novembre 2003StatutMembreDernière intervention24 avril 20071 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 ! (^^)