Requète MySQL compliquée (ou pas?)

pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 - 30 mai 2006 à 09:20
pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 - 1 juin 2006 à 22:27
Bonjour tout le monde !





Bon je vais essayer de vous expliquer le mieux possible mon problème parce que c'est assez compliqué ^^

Alors voilà, je dispose de 5 tables :
- architectes_fiches (id,nom,prénom etc...)
- chantiers_architectes (id, id_dossier,nom chantiers, budget etc...)
- dossiers_architectes (id,id_architecte,date,commercial etc...)
- contrats_clients (id, id_architecte, id_chantier, chiffre_daffaire etc...)
- régions (id, region)

Je dois faire des requètes de sélections en calculant la somme du chiffre d'affaire (contenu dans la table "contrats")
Je vous donne un exemple :
On prend un architecte avec l'ID "1" et comme nom "Paul", on l'associe à un dossier et on lui ajoute 3 chantiers, ce qui nous donne, 1 dossier avec en "id_architecte 1" et 3 chantiers avec id 1,2,3 et comme "id_dossier = 1". J'espère que jusque là vous me suivez. Maintenant à la comptabilité, ils vont associé un client (ça on s'enfout pour la requète) avec 1 architecte et 1 seul chantier de ce même architecte. Donc si vous me suivez, on aura alors dans la table "contrats" : "id = 1, id_architecte = 1, et on va prendre le 2e chantier "id_chantier = 2", la comptabilité va lui mettre un chiffre d'affaire de 500? par exemple.

Jusque là pas de soucis ! Mais quand on a plusieurs contrats pour le même architecte, il faut que lors de ma requète de sélection, je calcule la somme totale du chiffre d'affaire du dossier de cet architecte par ces chantiers ! J'ai réussi à faire cette requète mais le problème c'est qu'il ne m'affiche pas les chantiers n'ayant pas de chiffre d'affaire...

Je vous poste ma requète :

Dans la variable $champs, j'y ai mis les champs nécessaire et j'ai également mis : sum(clients_contrats.Tarif)
Tarif = chiffre d'affaire.

(je vous mets pas la liste parce que c'est trop long mais si c'est nécessaire, je la mettrais)
$sql 'SELECT '.$champs.' FROM archis_chantiers, archis_dossiers, archis_fiches, clients_contrats WHERE archis_chantiers.id_dossier archis_dossiers.id AND archis_dossiers.id_archi = archis_fiches.id AND clients_contrats.Ref_Chantier = archis_chantiers.id GROUP BY archis_chantiers.id ORDER BY archis_dossiers.id';
$req = mysql_query($sql) or die ('Erreur SQL : '.$sql.'
'.mysql_error());
$fields = mysql_num_fields($req);

for ($i = 0; $i < $fields; $i++) {
  $temp = mysql_field_name($req, $i);
  $header .= $temp . "\t";


while($row = mysql_fetch_row($req)) {
  $line = '';
  foreach($row as $value) {                                           
      if ((!isset($value)) OR ($value == "")) {
          $value = "\t";
      }
      else {
          $value = str_replace('"', '""', $value);
          $value = '"' . $value . '"' . "\t";
      }
      $line .= $value;
  }
  $data .= trim($line)." ?\n";
}

$data = str_replace("\r","",$data);

$file = "Archis_Total.xls";
$Fnm = '../../exports/'.$file;
$inF = fopen($Fnm,"w");
$data = str_replace("
","",$data);
$data = $header."\n".$data;  
fputs($inF,$data);

Comme voius l'aurez compris, une fois que j'ai selectionnée les données, je les mets dans un fichier excel, c'est pour les patrons...

J'espère que j'ai pu être assez clair, en tout cas, excuser moi si ça ne l'est pas :x

Ca fait une semaine que je galère avec, j'ai fouillé toute les docs MySQL pour les jointures mais j'ai pas trouvé mon bonheur donc HELLLP ! :x

Merci d'avance.

5 réponses

pcgpegase Messages postés 96 Date d'inscription lundi 24 novembre 2003 Statut Membre Dernière intervention 24 avril 2007 1
30 mai 2006 à 09:37
En fait, je viens de m'apercevoir que je me suis trompé sur un point :

"J'ai réussi à faire cette requète mais le problème c'est qu'il ne
m'affiche pas les chantiers n'ayant pas de chiffre d'affaire..."

Ce n'est pas que les chantiers n'ont pas de chiffre d'affaire, mais c'est qu'ils ne sont associés à aucun contrats!

C'est d'ailleurs pour ça que la requète ne les affiche pas, normalement...

Mais moi je veux les afficher ! :x
0
sidf Messages postés 1216 Date d'inscription mardi 20 décembre 2005 Statut Membre Dernière intervention 18 octobre 2012 5
1 juin 2006 à 20:27
salut,


$sql = 'SELECT '.$champs.' FROM archis_chantiers,

archis_dossiers,


archis_fiches

WHERE archis_chantiers.id_dossier =
archis_dossiers.id

AND archis_dossiers.id_archi = archis_fiches.id

GROUP BY
archis_chantiers.id ORDER BY archis_dossiers.id';


???
0
sidf Messages postés 1216 Date d'inscription mardi 20 décembre 2005 Statut Membre Dernière intervention 18 octobre 2012 5
1 juin 2006 à 20:29
et ensuite à chaque tour,

tu cherches si un contrat lui est associé
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
1 juin 2006 à 20:32
Cherche du coté de INNER JOIN, LEFT JOIN, RIGHT JOIN et compagnie... :)
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
1 juin 2006 à 22:27
Coucou,

Pour répondre à sidf, alors le truc c'est que ça marche comme ça, c'est à dire à chaque boucle, je balance une requète pour savoir si c'est associé, ça fonctionne, j'ai exactement les infos qu'il me faut mais le hic, c'est qu'il y à 20 000 enregistrements, et l'éexécution du script dur entre 20 et 30 minutes >_<

C'est pour ça que je cherche un moyen de le faire en une requète :/

Et pour répondre à FhX, j'ai déjà fouillé, et ma requète actuelle est déjà basée sur du LEFT JOIN ou INNER JOIN mais je reviens au même problème...

J'ai quand même bien avancé dans le sens où j'arrive à afficher les bonnes infos ;)

bye
0
Rejoignez-nous