par
moogli » 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
@+
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 [sql]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);[/sql]
les données qui vont bien
[sql]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');[/sql]
Attention la requête qui semble correspondre à ton besoin (assez complexe)
[sql]SELECT rubric_id,
rubric_description,
(SELECT COUNT(1) FROM products p WHERE p.rubric_id= r.rubric_id) AS nbProduct
FROM rubrics r;[/sql]
le résultat
[code]
rubric_id |rubric_description |nbProduct
1 | rub 1 | 4
2 | rub 2 | 2
3 | rub 2 | 4
[/code]
@+