boucle de comptage simplifié

Petit nouveau ! | 4 Messages

21 déc. 2016, 19:53

Bonjour à tous

Je travail sur le nouveau code de mon site de vente de particulier a particulier et je souhaite simplifier une recherche SQL dans une boucle

Je m'explique, je cherche dans ma base SQL un type de rubrique

Je fait une boucle pour affiché dans un menu chaque rubrique

Puis dans cette boucle je cherche tout les produits qui appartiennent à cette rubrique et j'affiche le nombre nombre de ligne entre () pour indiquer au client combien il y a de produit dans la rubrique

Sa marche très bien comme cela mais quand il y a beaucoup de débit de serveur passe sont temps à cherche le nombre d'article dans la rubrique

Donc je cherche un exemple de codage coté MYSQL pour effectué cela en une seule fois

Après l'autre possibilité que j'avais pensé c'est de créer un table avec la quantité de chaque annonce présente dans chaque rubrique et de mettre à jour cette base à l'ajout ou suppression d'une annonce... mais pourquoi faire le travail en double alors que toutes les infos sont sur le serveur.

Merci d'avance pour vos exemples et lien

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

22 déc. 2016, 13:33

salut,

effectivement c'est une erreur de faire une requête dans une boucle.

tu peux palier ton problème de deux façons :
- garder le code existant et ajouter un niveau de cache pour ne pas refaire la requête trop souvent (une fois fait tu gardes un tableau avec les données et tu sérialise la chose dans un fichier.
- une requête sql de compète :)

imaginons que tu ais ces deux tables
create table rubrics (
rubric_id int not null primary key,
rubric_description varchar(50) not null
);

create table products(
product_id int not null primary key,
rubric_id int not null,
product_description varchar(50) not null
);
alter table products add constraint FK_rubric foreign key (rubric_id) references rubrics(rubric_id);
les données qui vont bien
INSERT INTO rubrics (rubric_id, rubric_description) VALUES (1, 'rub 1');
INSERT INTO rubrics (rubric_id, rubric_description) VALUES (2, 'rub 2');
INSERT INTO rubrics (rubric_id, rubric_description) VALUES (3, 'rub 2');

insert into products (product_id,rubric_id, product_description) values (1,1,'p= 1 r = 1');
insert into products (product_id,rubric_id, product_description) values (2,1,'p= 2 r = 1');
insert into products (product_id,rubric_id, product_description) values (3,1,'p= 3 r = 1');
insert into products (product_id,rubric_id, product_description) values (4,2,'p= 4 r = 2');
insert into products (product_id,rubric_id, product_description) values (5,2,'p= 5 r = 2');
insert into products (product_id,rubric_id, product_description) values (6,3,'p= 6 r = 3');
insert into products (product_id,rubric_id, product_description) values (7,3,'p= 7 r = 3');
insert into products (product_id,rubric_id, product_description) values (8,3,'p= 8 r = 3');
insert into products (product_id,rubric_id, product_description) values (9,3,'p= 9 r = 3');
insert into products (product_id,rubric_id, product_description) values (10,1,'p= 10 r = 1');
insert into products (product_id,rubric_id, product_description) values (11,1,'p= 11 r = 1');
Attention la requête qui semble correspondre à ton besoin (assez complexe)
SELECT rubric_id,
  rubric_description,
  (SELECT COUNT(1) FROM products p WHERE p.rubric_id= r.rubric_id) AS nbProduct
FROM rubrics r;
le résultat

Code : Tout sélectionner

rubric_id |rubric_description |nbProduct 1 | rub 1 | 4 2 | rub 2 | 2 3 | rub 2 | 4
@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

22 déc. 2016, 13:43

hello

merci de ton retour j'avais fait le test avec count mais je m'en sortait pas car chose que je n'est pas dit pour simplifier ma question c'est que j'ai plusieurs autre parametre à controler

guerre
pays
rubrique
--> cela doit me sortir une quantité.

La solution de créer un table qui est mise à jour lors de l'ajout ou suppression d'annonce et toute les heures par un CRON ne serait t'elle pas plus simple ?

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

23 déc. 2016, 12:48

La solution de créer un table qui est mise à jour lors de l'ajout ou suppression d'annonce et toute les heures par un CRON ne serait t'elle pas plus simple ?
non, comme tu l'as dit il faut la maintenir c'est du boulot, de l'espace disque et une source d'emmerde si les données sont dé corrélées de la réalités. Et tu n'es pas certain de la "fraîcheur" des données (tu va mettre des trigger after insert / update ou mettre a jour la table ?).

Pour les autres paramètres si tu fournis les structures des tables (create table) voir même un jeu de données (quitte à être bidon mais cohérent) il sera possible de t'aider plus.

As tu pensé à utiliser group by ?

je déplace ton sujet sans la section SQL plus appropriée ;)

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