Page 1 sur 2

Compter dans une base de donnée

Posté : 29 déc. 2011, 17:53
par JoIsland
Bonjour à tous,

J'ai créer un SELECT pour qu'il m'affiche tous mes produits (beaucoup) , mais je souhaite qu'il me compte comme ceci :

Article 1 (x16)
Article 2 (x26)
etc..

c'est à dire qu'il m'affiche une seul fois mon article avec le nombre de fois trouvé , et non pas :

Article 1 (x16)
Article 2 (x26)
Article 3 (x16) équivalent à Article 1
Article 4 (x26) équivalent à Article 2

Comment puis-je les compter et les afficher de cette manière svp ?


pour le moment voici mon code :
<?php
$sales_best2 = mysql_query("SELECT *, COUNT(name) AS nb FROM matable  WHERE order_id='$entity' ORDER BY item_id DESC");
$nb = mysql_num_rows($sales_best2);
while ($donnees = mysql_fetch_array($sales_best2) )
{
$product = $donnees['product_id'];
$type = $donnees['product_type'];
$sku = $donnees['sku'];
$name = $donnees['name'];
$count = $count + 1;
$nn = mysql_result($sales_best2,0,"nb");

if ($type == "configurable") {
echo "$type --> $name --> (x$nn) --> id $count<br /><br />";
  }
 }
?>

il m'affiche bien des numéros qui m'on l'air cohérent .. mais vue que je ne suis pas sûr de mon code et que je ne peux pas m'amuser à tous les compter pour savoir si c'est bon j'aimerai confirmation de votre part .
par contre il ne m'affiche aucun produit à "(x1)" minimum "(x2)" donc je ne sais pas .

Re: Compter dans une base de donnée

Posté : 29 déc. 2011, 22:46
par moogli
salut,

utilise la clause group by

test avec phpmyadmin
SELECT *, COUNT(name) AS nb FROM matable WHERE order_id=xxx ORDER BY item_id DESC group by name;

en remplaçant xxx par une valeur de ta table ;)

@+

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 10:51
par JoIsland
Salut,

Voici l'erreur qu'il me donne :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group by name LIMIT 0, 30' at line 1

et en php il ne m'affiche plus rien ^^

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 11:34
par xTG
En fait la clause ORDER BY doit se trouver après la clause GROUP BY. :)

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 11:53
par JoIsland
Salut,

J'ai fais comme tu as dis , maintenant la page mouline et rien . lol , sa me rend fou :shock:

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 12:22
par xTG
Elle mouline c'est à dire ? Elle tourne à l'infinie sans jamais rien afficher ? => timeout ?
Elle tourne mais n'affiche rien ? => testes la requête sous phpmyadmin pour voir ce qu'elle retourne.

Et aussi :
$nn = mysql_result($sales_best2,0,"nb");
Là en fait tu demandes la récupération de nb du premier n-uplet retourné. Je suppose que ce n'est pas ce que tu souhaites mais bel et bien le nb pour chaque n-uplet :
$nn = $donnees['nb'];

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 12:29
par JoIsland
Elle mouline c'est à dire ? Elle tourne à l'infinie sans jamais rien afficher ? => timeout ?

Oui .
Elle tourne mais n'affiche rien ? => testes la requête sous phpmyadmin pour voir ce qu'elle retourne.
Elle me retourne "Aucune ligne"
Et aussi :
$nn = mysql_result($sales_best2,0,"nb");
Là en fait tu demandes la récupération de nb du premier n-uplet retourné. Je suppose que ce n'est pas ce que tu souhaites mais bel et bien le nb pour chaque n-uplet :
$nn = $donnees['nb'];
J'ai tester et sa retourne la même chose ^^

je ne connais pas vraiment la fonctionnalité de COUNT j'ai donc fais quelque test et avec
$nn = mysql_result($sales_best2,0,"nb");
sa me retournai des valeurs qui m'on l'air à peut prêt cohérente , mais comme je ne suis absolument pas sûr des résultats , je demande si j'ai bien formuler ma requête , à mon avis non. le GROUP BY name dans phpmyadmin c'est ok mais ne me retourne rien, en PHP je fais la même requête mais j'ai la boucle infinie qu'en penses-tu ?

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 12:38
par JoIsland
Ok je viens de retester avec le
$nn = $donnees['nb'];
et avec le GROUP BY name , sa me retourne rien comme via ma requête PHPmyadmin , maintenant j'aimerai savoir pourquoi il me retourne aucune valeur ? :?

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 12:45
par JoIsland
En gros , je souhaite :

Que ma requête récupère les infos de ma bdd à savoir que :

|id| |name| (etc..)
1 article 1
2 article 2
3 article 1
4 article 2


Il existe dans le champ name plusieurs article qui comporte exactement le même nom , je souhaite qu'il m'affiche qu'une seul le produit si il est doublé , puis il récupère le nombre de fois qu'il la trouvé , pour avoir un affiche de ce style :

Article 1 (x13)
Article 2 (x36)

Etc... :lol:

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 13:06
par xTG
Mes questions c'était un OU entre les deux. :roll:
Car tu ne peux avoir la fin du script avec aucun affichage et en même temps une boucle infinie et un message de timeout...

Que retournes mysql_num_rows() après le mysql_query() ? (ça compte le nombre de n-uplet retourné)
Mets un var_dump($donnees) dans ta boucle while pour voir ce qu'il te récupère pour chaque n-uplet.

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 13:08
par JoIsland
Le plus étonnant c'est que les infos qu'il me renvoie quand je fais une recherche dans mon PhpMyAdmin il n'éxiste pas :shock: genre l'article en question n’existe pas , je l'ai ai tous essayé , il n'en retrouve aucun ...

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 13:22
par JoIsland
Je te donne un exemple qu'il me renvoie (à savoir qu'il ma retourné des millions de ligne)
array(158) { [0]=> string(5) "35051" ["item_id"]=> string(5) "35051" [1]=> string(4) "7997" ["order_id"]=> string(4) "7997" [2]=> NULL ["parent_item_id"]=> NULL [3]=> string(5) "83695" ["quote_item_id"]=> string(5) "83695" [4]=> string(1) "1" ["store_id"]=> string(1) "1" [5]=> string(19) "2011-12-30 07:18:55" ["created_at"]=> string(19) "2011-12-30 07:18:55" [6]=> string(19) "2011-12-30 08:24:04" ["updated_at"]=> string(19) "2011-12-30 08:24:04" [7]=> string(4) "4271" ["product_id"]=> string(4) "4271" [8]=> string(12) "configurable"

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 13:29
par JoIsland
Et avec le GROUP BY name , il ne me renvoie rien du tout

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 13:45
par xTG
S'il ne te retourne rien du tout avec le GROUP BY c'est surement car il génère une erreur...
Car c'est uniquement le clause WHERE qui se charge de sélectionner ou non les n-uplets à retourner.
Montres nous ta requête actuel telle qu'elle a été modifiée.
Et utilises mysql_error() après le mysql_query() pour voir les erreurs retournées.

Re: Compter dans une base de donnée

Posté : 30 déc. 2011, 14:03
par JoIsland
Voici l'erreur qu'il me retourne :

Erreur SQL !
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE order_id='7997' ORDER BY item_id DESC' at line 1

Alors ce qui merde c'est
order_id='$entity' 
les guillemets ?

Voici ma requête php entière à ce jour :
<?php
$sales_best = mysql_query("SELECT * FROM sales_flat_order WHERE status='complete' ORDER BY entity_id DESC");
while ($donnees = mysql_fetch_array($sales_best) )
{
$entity = $donnees['entity_id'];
$total_item = $donnees['total_item_count'];

$sales_best2 = mysql_query("SELECT *, COUNT(name) AS nb FROM sales_flat_order_item GROUP BY name WHERE order_id='$entity' ORDER BY item_id DESC") or die('Erreur SQL !<br />'. mysql_error().'<br />');
$nb = mysql_num_rows($sales_best2);
while ($donnees = mysql_fetch_array($sales_best2)) 
{
$product = $donnees['product_id'];
$type = $donnees['product_type'];
$sku = $donnees['sku'];
$name = $donnees['name'];
$count = $count + 1;
$idd = $donnees['item_id'];
$nn = $donnees['nb'];

if ($type == "configurable") {
if ($nn > 25) {

echo "$name --> acheté : (x$nn) --> numéro : $count --> id : $idd --> SKU : $sku<br /><br />";
   } 
  }
 }
}

?>