Page 1 sur 1

Problème avec une requete mysql_num_rows

Posté : 04 oct. 2007, 16:02
par Toons43
Bonjour à tous,

Je débute en php et j'ai un problème avec une requete sql qui doit me permettre normallement d'afficher le nombre de valeur présentent dans la table.

Voici mon code
<?php
mysql_connect("localhost", "root", "123456"); // Connexion à MySQL
mysql_select_db("maBaseMySQL"); // Sélection de la base coursphp

$reponse = mysql_query("SELECT r.Marchand_code, m.ID, m.Marchand, m.Categorie, r.Date_fin 
           					FROM marchand m
           					LEFT JOIN reduction r ON m.ID = r.Marchand_id") or die(mysql_error()); 
		   
while ($donnees = mysql_fetch_array($reponse) )
{
?>
<a href="http://www.monsite.com/repertoire/<?php echo $donnees['Categorie']; ?>/<?php echo $donnees['ID']; ?>-<?php echo $donnees['Marchand'];?>.htm"><?php echo $donnees['Marchand']);?>&nbsp;

<?php
$donnees = mysql_num_rows($reponse); 
if (Date_fin < date('Y-m-d')) { 
echo '(0)', '</br>'; }
else {
echo '(', $donnees, ')', '</br>'; }
} ?>

<?php
mysql_close();
?>

J'aimerais que ce code me liste les marchands de ma table avec le nombre de pubs pour chacun si la date est encore valable

exemple :

marchand 1 (3)
marchand 2 (1)
marchand 3 (0)
marchand 4 (6)
...

Le problème c'est que ce code me liste tous les marchands avec le même nombre de pubs (ce qui correspond au nombre total de ligne de ma table)

J'ai fait une jointure de mes 2 tables car dans la première je liste les marchands, leur description, etc.. et dans la deuxième il y a toutes les pubs (plusieurs possibles par marchand) avec des dates d'expiration

Je ne sais pas du tout comment je dois faire, si l'un d'entre vous pouvez me donner un petit coup de main ce serait super gentil.

D'avance merci

Bonne journée

Posté : 04 oct. 2007, 16:34
par Tracker
Tu dois calculer via sql le nombre de pub par client, mysql_num_rows te retourne le nombre total d'enregistrement retournés par ta requête:

change un peu ta requête:

Code : Tout sélectionner

SELECT r.Marchand_code, m.ID, m.Marchand, m.Categorie, r.nb, r.mdf FROM marchand m LEFT JOIN ( select Marchand_id, count(*) as nb, max(Date_fin) as mdf from reduction group by Marchand_id ) r ON m.ID = r.Marchand_id
Il y a cependant une erreur de conception dans ton select, tu cherches le nombre de réduction par marchand, mais pour un marchand tu souhaites conserver toutes les dates de réduction, ???
tu dois choisir afficher les marchands ou les réductions !!
Dans le code ci dessus, j'ai opté pour afficher les marchands, donc j'ai prix la date de la plus récente reduction.

Il te suffit ensuite d'afficher le résultat, r.nb contenant le nombre de réduction par client

Posté : 04 oct. 2007, 17:30
par Toons43
Bonjour Tracker,

Tout d'abord merci pour ton aide, ton code fonctionne :D , du coup j'avance lol

En revanche comme tu le dis je souhaite conserver les dates du coup pour certains marchands il y a :

Marchand 1 (3)

alors que seulement 2 pubs sont encore valable, y'a t'il une possibilité pour conserver les dates?

J'ai confiance en toi, tu enas déjà fait beaucoup

D'avance merci

Posté : 04 oct. 2007, 18:23
par Tracker
En revanche comme tu le dis je souhaite conserver les dates du coup pour certains marchands il y a :
Marchand 1 (3)
alors que seulement 2 pubs sont encore valable, y'a t'il une possibilité pour conserver les dates?
J'ai du mal à comprendre ce que tu veux dire, mais bon je vais extrapoler:
- Ton marchand 1 à trois pubs (reductions) avec des dates de fin différentes

Si tu veux récupérer la liste des marchands avec le nombre de réductions de chacun, tu vois bien qu'il est difficile de faire, en SQL, entrer trois informations de date dans une seule case (sauf en utilisant un fonction utilisateur SQL permettant de caster les dates en chaine pour les concaténer, mais la méthode est crado !!)

Il te reste trois possibilités:
- faire un second ordre, récupérant marchand_id et date_fin dans reductions, que tu utiliseras en même temps que le premier ordre pour construire ton interface.
- bricoler l'ordre de départ pour obtenir la liste des dates, en même temps que le marchand et le nombre de réduction, et faire des ruptures (sur marchand_id) lors de l'affichage.
Marchand 1 (3) 01/01/2008
Marchand 1 (3) 01/02/2008
Marchand 1 (3) 01/03/2008
...

Code : Tout sélectionner

SELECT r.Marchand_code, m.ID, m.Marchand, m.Categorie, r1.nb, r2.date_fin FROM marchand m LEFT JOIN ( select Marchand_id, count(*) as nb from reduction group by Marchand_id ) r1 ON m.ID = r1.Marchand_id LEFT JOIN reduction r2 ON m.ID = r2.Marchand_id
ou dernière possibilité, compter (en php) les réductions par marchand lors de l'affichage (avec rupture sur marchand_id) en utilisant un ordre comme:

Code : Tout sélectionner

SELECT r.Marchand_code, m.ID, m.Marchand, m.Categorie, r.date_fin FROM marchand m LEFT JOIN reduction r ON m.ID = r.Marchand_id
C'est toi qui vois !! la dernière semble quand même la plus simple.

Posté : 04 oct. 2007, 18:47
par Toons43
Re-bonjour Tracker,

Encore merci de m'aider, j'ai essayé ton code, il fonctionne :D

Mais il me liste les marchands autant de fois qu'ils ont de reductions,

J'imagine donc que c'est cette histoire de rupture que je doit utiliser pour regler le problème

Mais le soucis c'est que je n'est aucune idée de comment on fait

Peux-tu me donner un peu plus de détails

D'avance merci beaucoup

Posté : 04 oct. 2007, 20:04
par Tracker
Regarde la solution qui a été proposée dans ce topic:
http://www.phpfrance.com/forums/voir_sujet-33161.php

Posté : 05 oct. 2007, 10:54
par Toons43
Bonjour,

Voila je m'y remet aprés une bonne nuit de réflexion,
J'ai bien lu le post que tu m'avais indiqué mais ça ne fonctionne pas pour moi

Voici le code que j'ai fait :

Code : Tout sélectionner

<?php mysql_connect("localhost", "root", "123456"); mysql_select_db("maBaseMySQL"); $sql=mysql_query("SELECT m.ID, m.Marchand, m.Categorie, r1.nb, r2.Date_fin FROM marchand m LEFT JOIN ( select Marchand_id, count(*) as nb from reduction WHERE Date_fin > NOW() group by Marchand_id ) r1 ON m.ID = r1.Marchand_id LEFT JOIN reduction r2 ON m.ID = r2.Marchand_id") or die(mysql_error()); // initilisation de la variable contenant l'identifiant du marchand $id_marchand = 0; while ($donnees = mysql_fetch_array($sql, MYSQL_ASSOC)) { // Si l'identifiant est différent de celui mémoriser, c'est qu'on a une nouvelle catégorie if ($donnees['Marchand_id'] != $id_marchand) { echo $donnees['Marchand']; $id_marchand = $donnees['Marchand_id']; } ?> <?php echo (' </br> '.$donnees['Marchand'].' ('.$donnees['nb'].')</br> '); } mysql_close(); ?>

Mais le résultat est de cette forme:

Marchand 1 (2)
Marchand 1 (2)
Marchand 1 (2)
Marchand 2 (0)
Marchand 3 (1)
...

Le problème est donc que pour le marchand 1 qui a 3 pubs dont 2 encore valable (c'est ce que l'on voit entre les () ) il se répetent autant de fois qu'il y a de pubs dans la table reduction, et le code que tu m'as donné n'y change rien.

En tout cas la requête est bonne, desormais ce n'est qu'un problème d'affichage

Je suis bloqué et je ne sais pas du tout comment faire.

Si tu as une solution pour me doner un petit coup de pouce.

D'avance merci

Posté : 05 oct. 2007, 11:03
par Tracker
La requête n'est pas tout à faire bonne, tu dois rajouter encore une fois la contrainte de date dans le second join sinon toutes les réductions remonteront:

Code : Tout sélectionner

[...] LEFT JOIN reduction r2 ON m.ID = r2.Marchand_id and r2.Date_fin > NOW() [...]
ps: La troisième solution (consistant à compter les réductions valides par client en php) était sans aucun doute plus simple, mais celle-ci fonctionne quand même avec moins de traitements php.

Posté : 05 oct. 2007, 11:19
par Toons43
Effectivement cette requete fonctionne mieux en rajoutant la dernière condition

Par contre je me retrouve toujours avec mon

Marchand 1 (2)
Marchand 1 (2)
Marchand 2 (1)
...

Comment eviter ce doublon sur le marchand 1

Merci de ton aide

Posté : 05 oct. 2007, 11:25
par Tracker
Ben avec le code que tu avais commencé, c'est plus une problématique SQL:
?><table><?php
    while ($donnees = mysql_fetch_array($sql, MYSQL_ASSOC))
    {
// Si l'identifiant est différent de celui mémoriser, c'est qu'on a une nouvelle catégorie
       if ($donnees['Marchand_id'] != $id_marchand)
       {
?><tr><td colspan="2"><?php
          echo htmlentities($donnees['Marchand'].' ('.$donnees['nb'].')');
          $id_marchand = $donnees['Marchand_id'];
?></td></tr>
       }
?><tr><td width="20px"></td><td><?php
       echo htmlentities('expiration :'.$donnees['date_fin']);
?></td></tr><?php
}
?></table><?php
J'ai tout mis dans un tableau, si tu veux une mise en page différente au boulot :wink:

Posté : 05 oct. 2007, 11:57
par Toons43
Avec la requête que tu m'as donnée j'obtient ça dans SQL

*************************************************
..ID....*...Marchand...*...Categorie...*...nb...*....Date_fin..*
*************************************************
...1.....*.marchand 1.*....cat 5.........*...2.....* 2007-10-18
...1.....*.marchand 1.*....cat 5.........*...2.....* 2007-11-09
...5.....*.marchand 2.*....cat 3.........*...1.....* 2007-11-03
..12....*.marchand 3.*....cat 5.........*.NULL..*.......NULL.....
..34....*.marchand 4.*....cat 6.........*.NULL..*.......NULL.....
*************************************************

Il est donc normal que lorsque j'affiche les résultats marchand 1 apparraisse 2 fois,
Moi j'aimerai qu'il n'apparraisse qu'une seule fois

Le code php avec la variable $id_marchand ne fonctionne pas

Peut-être que c'est impossible, si c'est le cas j'abandonne tampis,

Qu'en penses-tu, y'a t-il une solution ?

Merci pour le temps que tu y consacre

Posté : 05 oct. 2007, 12:45
par Tracker
Le code php de mon dernier post t'affiche quoi ?

Posté : 05 oct. 2007, 12:57
par Toons43
C'est bon j'ai réussi :D

Je ne prenais pas la bonne variable pour afficher mes marchands, mais maintenant ça marche,

=D> =D> =D> à toi et merci mille fois pour ton aide précieuse

A bientôt

Posté : 05 oct. 2007, 13:38
par Truc
Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).