Compter dans une base de donnée

JoIsland
Invité n'ayant pas de compte PHPfrance

29 déc. 2011, 17:53

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 .

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 déc. 2011, 22:46

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 ;)

@+
Il en faut peu pour être heureux ......

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 10:51

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 ^^

ViPHP
xTG
ViPHP | 7331 Messages

30 déc. 2011, 11:34

En fait la clause ORDER BY doit se trouver après la clause GROUP BY. :)

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 11:53

Salut,

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

ViPHP
xTG
ViPHP | 7331 Messages

30 déc. 2011, 12:22

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'];

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 12:29

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 ?

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 12:38

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 ? :?

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 12:45

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:

ViPHP
xTG
ViPHP | 7331 Messages

30 déc. 2011, 13:06

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.

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 13:08

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 ...

JoIsland
Invité n'ayant pas de compte PHPfrance

30 déc. 2011, 13:22

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"

Eléphanteau du PHP | 12 Messages

30 déc. 2011, 13:29

Et avec le GROUP BY name , il ne me renvoie rien du tout

ViPHP
xTG
ViPHP | 7331 Messages

30 déc. 2011, 13:45

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.

Eléphanteau du PHP | 12 Messages

30 déc. 2011, 14:03

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 />";
   } 
  }
 }
}

?>