Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Optimisation d'une requête MySQL

3 réponses
Avatar
max
Bonjour à tous,

J'ai deux tables dans ma BD, les clients et les articles. Je dois
afficher la liste des clients (avec informations sur le client) et
afficher pour chaque client, le nombre des articles qui vérifient
certaines conditions (vendu, en attente, retour, etc.)

Tout ce que j'ai trouvé à faire pour le moment, c'est de passer à
travers ma table des clients et pour chacun d'entre eux, je récupère les
informations spécifiques dont j'ai besoin (nom, adresse, etc.).

SELECT info1, info2 FROM `cli` WHERE (dep_id = '".$dep_id."')

Puis, je passe à travers la table des articles (chaque record d'article
contient le no du client) plusieurs fois en faisant à chaque fois des
count(*) car je dois ultimement compter les records vérifiant les
différentes conditions pour chaque client.

Style:
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition1
= vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition2
= vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition3
= vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition4
= vrai)

et ainsi de suite. Je me doute que ce n'est pas la meilleure façon de
faire mais je n'en n'ai pas trouvé d'autres.

Informations supplémentaires:
1. Les conditions (1, 2, 3, etc.) sont toutes différentes, avec un order
by différent éventuellement sur chaque requête.
2. Je ne récupère pas forcément les mêmes champs pour chaque requête,
quoi que je pourrais certainement trouver un ensemble commun si nécessaire.

Votre aide me serait précieuse...
Merci,

Max

3 réponses

Avatar
Xavier Nayrac
max a écrit :
Bonjour à tous,

J'ai deux tables dans ma BD, les clients et les articles. Je dois
afficher la liste des clients (avec informations sur le client) et
afficher pour chaque client, le nombre des articles qui vérifient
certaines conditions (vendu, en attente, retour, etc.)

Tout ce que j'ai trouvé à faire pour le moment, c'est de passer à
travers ma table des clients et pour chacun d'entre eux, je récupère les
informations spécifiques dont j'ai besoin (nom, adresse, etc.).

SELECT info1, info2 FROM `cli` WHERE (dep_id = '".$dep_id."')

Puis, je passe à travers la table des articles (chaque record d'article
contient le no du client) plusieurs fois en faisant à chaque fois des
count(*) car je dois ultimement compter les records vérifiant les
différentes conditions pour chaque client.

Style:
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition1
= vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition2
= vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition3
= vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND condition4
= vrai)

et ainsi de suite. Je me doute que ce n'est pas la meilleure façon de
faire mais je n'en n'ai pas trouvé d'autres.

Informations supplémentaires:
1. Les conditions (1, 2, 3, etc.) sont toutes différentes, avec un order
by différent éventuellement sur chaque requête.
2. Je ne récupère pas forcément les mêmes champs pour chaque requête,
quoi que je pourrais certainement trouver un ensemble commun si nécessaire.

Votre aide me serait précieuse...
Merci,

Max



Bonjour Max,

Pourrais tu préciser un peu ta pensée et donner des infos
complémentaires car j'ai du mal à cerner ton problème :

* structure des tables
* quelle(s) requête(s) te pose(nt) un problème ?
* quel est ta question exactement ?
* un exemple de l'état de sortie que tu cherches à obtenir

--
Xavier Nayrac
Avatar
max
Xavier Nayrac a écrit :
max a écrit :
Bonjour à tous,

J'ai deux tables dans ma BD, les clients et les articles. Je dois
afficher la liste des clients (avec informations sur le client) et
afficher pour chaque client, le nombre des articles qui vérifient
certaines conditions (vendu, en attente, retour, etc.)

Tout ce que j'ai trouvé à faire pour le moment, c'est de passer à
travers ma table des clients et pour chacun d'entre eux, je récupère
les informations spécifiques dont j'ai besoin (nom, adresse, etc.).

SELECT info1, info2 FROM `cli` WHERE (dep_id = '".$dep_id."')

Puis, je passe à travers la table des articles (chaque record
d'article contient le no du client) plusieurs fois en faisant à chaque
fois des count(*) car je dois ultimement compter les records vérifiant
les différentes conditions pour chaque client.

Style:
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND
condition1 = vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND
condition2 = vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND
condition3 = vrai)
SELECT count(*) FROM `art` WHERE (dep_id = '".$dep_id."' AND
condition4 = vrai)

et ainsi de suite. Je me doute que ce n'est pas la meilleure façon de
faire mais je n'en n'ai pas trouvé d'autres.

Informations supplémentaires:
1. Les conditions (1, 2, 3, etc.) sont toutes différentes, avec un
order by différent éventuellement sur chaque requête.
2. Je ne récupère pas forcément les mêmes champs pour chaque requête,
quoi que je pourrais certainement trouver un ensemble commun si
nécessaire.

Votre aide me serait précieuse...
Merci,

Max



Bonjour Max,

Pourrais tu préciser un peu ta pensée et donner des infos
complémentaires car j'ai du mal à cerner ton problème :

* structure des tables
* quelle(s) requête(s) te pose(nt) un problème ?
* quel est ta question exactement ?
* un exemple de l'état de sortie que tu cherches à obtenir




Bonjour Xavier,

En fait, les tables sont organisées "normalement", deux tables toutes
simples avec chacune environ 20 champs. J'ai expliqué comment la table
cli est reliée à la table art dans mon introduction.

Mon problème est que la conjonction des requêtes de comptage imbriquées
dans la requête principale sur chaque client (sur la table cli) prend
beaucoup de temps. Je me disais qu'il existait peut-être une meilleure
façon d'aller chercher l'information, comme une requête avec un "join"
pour aller chercher chaque client et le nombre d'article de chaque
catégorie pour ce client. Étant donné que le numéro du client est sur
chaque article, je me dit qu'on pourrait simplement fouillé dans la
table art et rechercher, pour chaque client, les articles de chaque
catégorie.

L'exemple de sortie est le suivant:

No client vendu remis acheté retourné
client 1 3 4 0 2
client 2 0 0 1 0
client 3 2 1 2 0
client 4 3 2 0 0
client 5 5 2 1 1

J'espère que cela pourra aider dans vos propositions.
Merci,

Max
Avatar
Jerome PAULIN
max a écrit :

L'exemple de sortie est le suivant:

No client vendu remis acheté retourné
client 1 3 4 0 2
client 2 0 0 1 0
client 3 2 1 2 0
client 4 3 2 0 0
client 5 5 2 1 1

J'espère que cela pourra aider dans vos propositions.
Merci,

Max




Bonjour,

essaye quelque chose dans ce genre :

select
no_client,
sum(if(vendu is not null,1,0)) as nbvendu,
sum(if(remis is not null,1,0)) as nbremis,
sum(if(achete is not null,1,0)) as nbachete,
sum(if(retourne is not null,1,0)) as nbretourne
from
clients
left join articles on ............
group by
no_client


C'est bien entendu a adapter à tes tables, mais c'est sur ce principe
que je procéderai ...

gg