Requette saute les result null

Fermé
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 - 3 sept. 2009 à 11:07
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 - 7 sept. 2009 à 17:20
Bonjour,

je fait une requette qui marche presque comme je veu sauf que quand il trouve rien il m'affiche pas le 0 et j'aimerai qu'il m'affiche le 0

voilà mon résultat affiché on voit que le 2009-01-25 et le 2009-01-26 c'est bon j'ai 2 mais après j'ai rien jusqu'au 2009-02-01


2009-01-24
2009-01-25-----2
2009-01-26-----2
2009-02-01-----1
2009-02-26-----1
2009-02-27-----1
2009-03-05-----1
2009-03-26-----1
2009-04-01-----1
2009-04-09-----1
2009-04-17-----1
2009-04-22-----1
2009-05-15-----1



ce que je voudrait c'est u affichage comme sa :

2009-01-24
2009-01-25-----2
2009-01-26-----2
2009-01-27-----0
2009-01-28-----0
2009-01-29-----0
2009-01-30-----0
2009-02-01-----1
.
.
.



mais j'arrive pas à le faire je vous montre ma requette pour que vous puissier m'aider merci

SELECT  commandes_date,Count(co.commandes_status) AS Nb_commandes FROM customers cu INNER JOIN commandes co ON cu.customers_id=co.customers_id WHERE cu.customers_date_inscription = '2009-01-24' and co.commandes_status = '1' and cu.customers_from = 'adwords' group by commandes_date


Merci de votre compréhenssion

16 réponses

sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
3 sept. 2009 à 12:19
Re-bonjours,

j'ai essayer avec ifnull mais sa marche toujours pas??
0
bonjour,
Excuse moi, mais ta demande ne me parait pas très claire.
D'abord le contexte : quelle est la base de donnée? mysql, oracle ou autre ?
Quel interface utilise tu pour afficher les résultats ? un outil console comme mysql, un outil graphique comme sqldevelopper ou phpmyadmin, ou passes tu pas un appel en php pour l'affichage ?
Ensuite, les dates que tu veux afficher sont-elles stockées toutes en base de donnée ou s'agit-il d'une série logique de date entre date début et date fin ?
Si tu répond à ces questions, je pense que l'on pourra t'aider davantage !
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
3 sept. 2009 à 14:08
Désolé

Voilà j'ai une base de donnée mysql et je test sur easyphp la requette que j'ai utilisé je l'ai lancé sur sur phpmyadmin mais j'ai aussi un scripte avec d'autre traitement et sa sort sou tableau. Les dates sont stocké dans une base de données.

enffette je suis sur deux table comme ta pu le voir client et commande.
mon but est que je veu savoir quand un client a commandé à partire de sa date d'inscription.
la date que j'ai mis en dur pour l'exemple est sa date d'inscription et quand je sort le résultat je veu que ce soit sa date d'achat au commande_status '1'
mais quand il trouve rien pour un jour il mets pas 0 ce qui fausse mon tableau qui est comme cela

Dates  	        0  1   2   3   4  5   6   	7   8  9   10    11  12 etc=>70
--------------------------------------------------------------------------------	  
2009-01-24 	2  2 	1    1   1  1   1 	1   1 	 1   1      1
2009-01-25 	1  1 	1
2009-01-26 	2  1 	1    1   1  1   2 	1   1


mais c'est imposible qu'il y ait un 1 ou 2 commande le jours 0 normalement sa devrait être comme sa
Dates  	        0   	1      2   	3   	4   	5   	6   	7   	8   	9   	10    11  	12 etc=>70	  
2009-01-24 	0 	2 	1 	0 	1 	1 	1 	1 	1 	1 	1 	1       1
2009-01-25 	0 	1 	1
2009-01-26 	0 	1 	1 	1 	1 	1 	2 	1 	1


car quant c'est 0 sa saute des jours

J'espère que j'ai bien réussit a m'exprimer et qu'il te manque rien pour pouvoir m'aider merci en tous cas
0
Je ne suis pas complètement ce que tu veux faire, mais si tu veux inclure des éléments d'une des deux tables qui ne satisfont pas à la condition, il faudrait au moins utiliser un OUTER JOIN et pas un INNER JOIN.
Est-ce que cette indication te suffit ?
0

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

Posez votre question
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
3 sept. 2009 à 14:56
je te remerci mais non désolé

je croi que je doit faire en sorte que sa me liste date par date et quand il trouve rien donc un null je fait une condition et si je trouve un résulta j'en fai une autre

et quand je fait le outer

sa me dit que sa c'est faux
	while($row1 = mysql_fetch_assoc($result_com)) {
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
3 sept. 2009 à 15:19
il faudrai que je fasse commandes_dates plus 1 si je trouve rien je passe quelque chose a l'affichage mais je sai pas commen fair pourrait tu m'aider??
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
3 sept. 2009 à 16:17
Je n'ai pas bien compris, toujours est-il que ce n'est pas un OUTER que tu dois utiliser, mais un LEFT JOIN (OU RIGHT selon l'ordre) si le problème des NULL vient de tes jointures.

Mais je pense plutôt que cela vient du fait que tu utilises le nom de la colonne dans ton COUNT, ce qui fait que les résultats NULL ne sont pas comptés, donc comme tu souhaites qu'ils soient comptabilisés, c'est COUNT(*) dont tu dois te servir.

A voir.
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
3 sept. 2009 à 16:22
oui merci mais le problème n'est pas celui là
c'est que des fois j'ai rien pour la date du ex: 2009-02-05 donc sa va rien me compté ni null ni rien du tous
ce sera vide et sa passera a la suivante

franchement je suis perdu
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
3 sept. 2009 à 16:30
Tu affiches les résultats de quelle façon ?

A-priori, ce serait donc un problème lié au fait que tu n'utilises pas de LEFT JOIN.

Tu as essayé au moins ?
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
3 sept. 2009 à 16:46
oui j'ai essayé mais sa me donne le même résultats

peut être qu'avec mon code tu verra quelque chose

<b> Stats pour <?php echo $presta; ?></b>
	<table border="1">
		<tr style="text-align: center; background-color:#FFAD5B; font-weight:bold;">
			<th> Dates </th>
			<?php for ($i=1; $i<=70; $i++) { ?>
            <th> &nbsp;<?php echo $i ;?>&nbsp; </th>
			 <?php } ?>
		</tr>
        
<?php

	
	//requette pour id,inscription,cu.from
	$query = "SELECT DISTINCT customers_id, customers_date_inscription, customers_from FROM customers WHERE customers_from = '".$presta."' " . $custom . " GROUP BY customers_date_inscription ORDER BY customers_date_inscription asc ";
	$result = mysql_query($query);
	
	while($row = mysql_fetch_assoc($result)) {
		//$custom_id = $row["customers_id"];
		$custom_date = $row["customers_date_inscription"];
		echo '<br />';	
		echo $custom_date;
		echo "<tr><td width=\"100\">" . $custom_date . "</td>\r\n";
		
		//$plus = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")+$i,  date("Y")));
		$query_comm = "SELECT Sum(co.commandes_status) AS Nb_commandes, cu.customers_id, commandes_date FROM customers cu LEFT  JOIN commandes co ON cu.customers_id=co.customers_id WHERE cu.customers_date_inscription = '".$custom_date."'  and cu.customers_from = '".$presta."' and co.commandes_status ='1'  group by commandes_date";
		$result_com = mysql_query($query_comm);

			while($row1 = mysql_fetch_assoc($result_com)) {
				//$custom_id = $row["customers_id"];
				$custom_id = $row1["customers_id"];	
				$comm_date = $row1["commandes_date"];	
				$comm_nb = $row1["Nb_commandes"];

				echo "<td width=\"100\">" . $comm_nb . "</td>\r\n";
				echo '<br />';	
				echo $custom_id; echo "-----"; echo $comm_date; echo "-----"; echo $comm_nb; echo "-----"; //echo $a; 
				
			}
	}
?>
</table>
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
3 sept. 2009 à 17:02
Ah oui, là y'a en effet de gros problèmes, je ne comprends rien à tes requetes imbriquées qui au passage sont d'une lourdeur extrême, c'est le genre de script où l'on se retrouve avec 500 requetes, voir plus sur une même page.

Excellent moyen de se faire exclure de son hébergement pour usage abusif de ressources.

Comme je ne vois pas trop, je te suggère d'utiliser un var_dump() sur la variable affichant le résultat vide, et montrer de qu'elle retourne.

Mais je crois qu'il serait nécessaire d'abord de revoir un peu ton code dans sa globalité.
0
Sinifer, rebonjourje suis assez d'accord avec p@t@chon, mais je peut te donner une piste :

Je parlais d'Outer JOIN et je pense toujours que c'est le seul moyen d'afficher des résultat d'une jointure qu'on ne veut par restreindre pour une des tables jointes. Il s'agit bine sûr d'un LEFT OUTER JOIN (ou RIGHT OUTER JOIN)
Pour prouver ma bonne foi (et que je sais de quoi je parle, je te donne ici un exemple de ton problème, mais simplifié :
L'idée est la suivante : se servir d'une table temporaire pivot
C'est quoi ?
C'est tut simplement une table remplie avec une série (ici une suite d'entier naturels) qui va servir à faire une série de date grâce à ADDDATE()
Ensite, je n'ai plus qu'a faire une jointure left outer avec ma able qui a u champ date, pour afficher toutes les dates, et d'affichier le nom dans ma colonne DEP_NOM si il a correspondance, et "RIEN3 sinon.
ca donne ceci (testé sur ma base mysql désolé, ce ne sont pas exactement test données, mais tu comprendras :
-- Je crée une table temporaire qui va me servir de pivot
-- Cette table va contenir seulement des entiers compris entre 1 et par exemple 6
-- Pour faciliter la chose, je met un auto-increment

CREATE TEMPORARY TABLE TAB_SEQ (
ID INTEGER NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
);
-- j'insere autant de valeurs que nécessaire
INSERT INTO TAB_SEQ (ID), VALUES(NULL),VALUES(NULL),VALUES(NULL),VALUES(NULL),VALUES(NULL),

-- Je me sert de cette table comme d'un pivot : si je veut toutes les dates depuis le 
-- 24 janvier 2009 jusqu'au 24/01/2009 + nombre d'éléments de ma table temporaire jours
-- je fais :

-- Jointure qui va afficher toutes les dates depuis le 24/01/2009 même s'il n'y a rien
-- qui correspond dans ma table DEP_DEPARTEMENT 
-- Ceci est un exemple pour montrer le principe du pivot et de l'efet du LEFT OUTER JOIN
 SELECT ADDDATE('2009-23-01', INTERVAL ID DAY) AS LADATE, IFNULL(B.DEP_NOM,'RIEN')  
 FROM TAB_SEQ LESDATES
 LEFT OUTER JOIN DEP_DEPARTEMENT B
 ON  B.DEB_DATECRE = ADDDATE('2009-08-01', INTERVAL LESDATES.ID DAY);

-- La table temporaire disparaîtra d'elle même à la fin de la session.
-- Bien sûr, si on fait souvent ce genre de calcul, on peut rendre la table permanente et la remplir
-- par une boucle dans une procédure stockée ! Elle pourra alors servir à d'autre requête et le fait qu'elle
-- existe déjà accélerera le processus.

Sachant que la table DEP_DEPARTEMENT contient :
mysql> SELECT * FROM DEP_DEPARTEMENT;
+--------+---------------+-------------+
| DEP_ID | DEP_NOM       | DEB_DATECRE |
+--------+---------------+-------------+
|     29 | FINISTERE     | 2009-08-03  |
|     31 | HAUTE_GARONNE | 2009-08-12  |
|     83 | VAR           | 2009-10-01  |
|     84 | VAUCLUSE      | 2009-09-01  |
+--------+---------------+-------------+
ça me sort :
+------------+--------------------------+
| LADATE     | IFNULL(B.DEP_NOM,'RIEN') |
+------------+--------------------------+
| 2009-08-02 | RIEN                     |
| 2009-08-03 | FINISTERE                |
| 2009-08-04 | RIEN                     |
| 2009-08-05 | RIEN                     |
| 2009-08-06 | RIEN                     |
| 2009-08-07 | RIEN                     |
| 2009-08-08 | RIEN                     |
+------------+--------------------------+

Je pense que tu peux t'inspirer de ça pour ton pb.
Par contre, je te conseille moi aussi de simplifier tes requêtes, essaye de faire le traitement sql en un seul morceau et pas dans des boucles php
Bon courage !
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
4 sept. 2009 à 08:22
ok merci beaucoup je vais essayé,
je commencé a déprimer et de voir sa de bon matin sa me remonte le moral

merci en tous cas

et je te tien au courant de mon avencement
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
4 sept. 2009 à 14:14
Merci

en tous cas par contre j'ai une question c'est que quand je lance cette requette

SELECT Sum(IFNULL(co.commandes_status,'0')) AS Nb_commandes, cu.customers_id, commandes_date FROM customers cu LEFT OUTER JOIN commandes co ON cu.customers_id=co.customers_id WHERE cu.customers_date_inscription = '2009-01-24'  and cu.customers_from = 'adwords' and co.commandes_status ='1' and co.commandes_date ='2009-01-27' group by commandes_date


sa me sort MySQL n'a retourné aucun enregistrement.
es ce que ma requette avec le if est fausse??
0
snifer, bonjour

Si ma réponse a pu t'aider, c'est bien, même si je ne vois pas l'utilisation de la table pivot que je te conseillais pour avoir toutes les dates affichées, même celles qui n'ont pas de commandes correspondantes, sauf si cest ta table customer qui te sert de pivot.

Bon pour la dernière requête, voici mes remarques :
1) C'est inutile de faire Sum(IFNULL(XXX,valeurREmplacment) car les fonction d'agrégat comme SUM éliminent automatiquement les valeurs NULL.
2) Je ne sais pas si c'est exprès, j'en doute, mais tu fait la somme des statuts de commandes. Si par exemple tu as une commande avec statut 1 et deux commandes avec statut 3, ton résultat sera 7 : c'est ça que tu veux ? ou voudrait tu faire plutôt count(co.commandes_status) ?
3) A quoi te sert le left outerjoin puisque tu fait un group by commad_date, et tu n'aura donc des lignes que correspondantes à la table commandes ?
4) Es tu sûr que cette requête marche? A vue de nez, mais je peux me tromper, il devrait y avoir une erreur réclamant un group by pour customer.id

Essai de mettre ta requête au point petit à petit, c'est à dire :
Faire la requête sans fonction d'agrégat et sans group by.
Éventuellement, essaie d'abord de lancer la requette avec un INNER JOIN au lieu de l'OUTER JOIN pour voir si tu as au moins un réssultat comme ça.
NBon courage !
0
sinifer Messages postés 312 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 12 mars 2013 11
7 sept. 2009 à 17:20
Bonjour,

excuse moi de te répondre que maintenant mais je sui malade donc j'ai pas trop regardé.
mais je vois que il me reste un long chemin c'est vrai que j'ai beaucoup de peine dans la réalisation de ce scripte mais j'y arriverai.

pour le sum j'ai changé en count mais sa marche toujours pas cette requette c'étais juste pour testé si sa marchais l'affichage de résultat si il y a rien mais malheureusement non :( pourtan j'ai fai un LEFT OUTER JOIN comme montré dans ton example j'ai aussi testé avec le INNER JOIN toujours rien

Par contre en enlevant mon group by commandes_date sa m'affiche les résultats que je voulais
par contre c'est pas des plus performant.

Tu m'as dis que je pouvais faire qu'une requette mais je vois pas comment fair car je me base sur les customers incrit la date demandé par :

<input type="text" style="width:180" name="Du" value="<?php echo $date_du; ?>"><br />
if (isset($date_du) && $date_du !='') {
		$custom .= " AND customers_date_inscription>='" . $date_du . "' ";



et après je lance ma requette

$query = "SELECT DISTINCT customers_id, customers_date_inscription, customers_from FROM customers WHERE customers_from = '".$presta."' " . $custom . " GROUP BY customers_date_inscription ORDER BY customers_date_inscription asc ";


pour qu'a la dernière requette j'ai par date donc maintenant sa donne sa:

	//requette pour id,inscription,cu.from
	$query = "SELECT DISTINCT customers_id, customers_date_inscription, customers_from FROM customers WHERE customers_from = '".$presta."' " . $custom . " GROUP BY customers_date_inscription ORDER BY customers_date_inscription asc ";
	$result = mysql_query($query);
	//date +$a
	
	while($row = mysql_fetch_assoc($result)) {
		//$custom_id = $row["customers_id"];
		$custom_date = $row["customers_date_inscription"];
		echo '<br />';	
		echo $custom_date;
		echo "<tr><td width=\"100\">" . $custom_date . "</td>\r\n";
		echo '<br />';	
		for ($i=1; $i<=4; $i++) { 
			$com_dat = strtotime($date_du. '+' .$i. 'days'); 
			$endDate = date('Y-m-d', $com_dat);
			echo '<br />';	echo $endDate ; echo 'test date' ;echo '<br />';	echo '<br />';	
		//$plus = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")+$i,  date("Y"))); B.DEP_NOM 
		$query_comm = "SELECT count(IFNULL(co.commandes_status,'0')) AS Nb_commandes, cu.customers_id, commandes_date FROM customers cu inner JOIN commandes co ON cu.customers_id=co.customers_id WHERE cu.customers_date_inscription = '".$custom_date."'  and cu.customers_from = '".$presta."' and co.commandes_status ='1' and co.commandes_date ='".$endDate."' ";
		$result_com = mysql_query($query_comm);

			while($row1 = mysql_fetch_assoc($result_com)) {
				//$custom_id = $row["customers_id"];
				$custom_id = $row1["customers_id"];	
				$comm_date = $row1["commandes_date"];	
				$comm_nb = $row1["Nb_commandes"];

				echo "<td width=\"100\">" . $comm_nb . "</td>\r\n";
				echo '<br />';	
				echo $custom_id; echo "-----"; echo $comm_date; echo "-----"; echo $comm_nb;  
				
			}
	}

}


et sa marche plus ou moin mais c'est vrai qu'il faut que j'optimise sa mais je vois pas comment si tu avais une idée ce serait cool

en tous cas merci pour ton aide
0