OVH Cloud OVH Cloud

Probleme de creation de requete

2 réponses
Avatar
Fred
Bonjour,


Je vous envoie la base ACCESS en fichier joint pour simplifier les choses

Voila le PB :

La table 'commerce' contient parmi d'autres champs la clé de la catégorie
principale (d'activité) ainsi que le cle de la sous catégorie
Respectivement(ID_Categorie et ID_SsCategorie)

La table 'Categorie' elle, possède la clé primaire ID_Categorie ainsi que le
nom de la categorie
La table 'SsCategorie' contient les sous catégories rattachées aux
ID_Categorie de la table Categorie ainsi que leur nom (Nom_SsCategorie)

Je dois formuler une requete qui doit retourner ceci :
(quand je passe en paramètre ID_Categorie , depuis une combo de la liste des
catégories)

Exemple ici : 52 (restaurants)

Les resultat comme vous le voyez sont le nombre de comme pour chaque sous
catégorie ..


- Asiatiques (Restaurants) 61 résultats

- Brasseries (Restaurants) 48 résultats

- Creperies (Restaurants) 14 résultats

- Gastronomique (Restaurants) 19 résultats

- Grillades (Restaurants) 34 résultats

- Originaux (Restaurants) 33 résultats

- Pizzerias (Restaurants) 94 résultats

- Restauration à domicile (Restaurants) 23 résultats

- Restauration rapide (Restaurants) 22 résultats

- Spécialités étrangères (Restaurants) 74 résultats

- Spécialités françaises (Restaurants) 33 résultats

- Spécialités Régionales (Restaurants) 23 résultats

- Traditionnels (Restaurants) 148 résultats

- Traiteurs (Restaurants) 85 résultats

Jusqu'ici c'est simple de la faire en plusieurs requetes imbriquees mais ce
n'est pas possible car cette algorithme de recherche doit servir aussi pour
ce qui va suivre .

On aurait pu faire :

1] Select toutes les sous-categories where id_categorie=52 dans sscategorie
2] select count de l'index de la sous categorie
{ écrire le résultat}
2'] movenext
1'] movenext

Mais ce la ne va pas car c'est trop long , la table contient en realite
plusieurs milliers d'enregistrements a filtrer
Donc les boucles ne sont pas trop recommandées

Et aussi du fait que l'on peut aussi passer en paramètre un critère de
recherche (mot(s)-clé(s))supplémentaire du type STRING qui devra, lui, en
plus de parcourir dans cette requette :
Les champs suivants :

Commerce.nom_commerce
Commerce.description_commerce
Categorie.nom_categorie
Categorie.motcles_categorie
SsCategorie.nom_SsCategorie


Voila le probleme, ce qui tend à optimiser la recherche en utilisant des
'XOR' pour chacun des criteres ci-dessus, ne fait en fait que la compliquer

Je dois donc pour eviter des ralentissements de l'ordre de 10 a 15 secondes
par recherche comme j'avais auparavant , trouver un algorithme qui puisse
supporter tous ces paramètres en un seul passage, tout en tenant compte du
fait que les deux parametres peuvent interagir ensemble ou séparement !!!!!
(1 et 1 ,1 et 0,0 et 1)


Merci de votre aide

Fred

2 réponses

Avatar
Fred BROUARD
bonjour;

Pouvez vous donner la description de vos tables sous forme d'ordre SQL afin que
tout un chacun puisse reproduire votre problème et vous donner une solution.
Ajoutez un jeu d'essais sous forme d'insert, comme dans cet exemple :

***************

CREATE TABLE MaTable
(Col1 VARCHAR(128),
Col2 INTEGER,
Col3 DATE,
Col4 CHAR(32),
CONSTRAINT PK_MaTable PRIMARY KEY (COL1, COL2))

INSERT INTO MaTable (COL1, COL2, COL3)
VALUES ('Un mot', 32, CURRENT_TIMESTAMP)
INSERT INTO MaTable (COL1, COL2, COL3)
VALUES ('Deux maux', 0, NULL)

-- Le résultat attendu :
NOM VILLE NOMBRE
------ ---------- ------
MARTIN PARIS 2
DUPOND STRASBOURG 3
...

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Fred a écrit:
Bonjour,


Je vous envoie la base ACCESS en fichier joint pour simplifier les choses

Voila le PB :

La table 'commerce' contient parmi d'autres champs la clé de la catégorie
principale (d'activité) ainsi que le cle de la sous catégorie
Respectivement(ID_Categorie et ID_SsCategorie)

La table 'Categorie' elle, possède la clé primaire ID_Categorie ainsi que le
nom de la categorie
La table 'SsCategorie' contient les sous catégories rattachées aux
ID_Categorie de la table Categorie ainsi que leur nom (Nom_SsCategorie)

Je dois formuler une requete qui doit retourner ceci :
(quand je passe en paramètre ID_Categorie , depuis une combo de la liste des
catégories)

Exemple ici : 52 (restaurants)

Les resultat comme vous le voyez sont le nombre de comme pour chaque sous
catégorie ..


- Asiatiques (Restaurants) 61 résultats

- Brasseries (Restaurants) 48 résultats

- Creperies (Restaurants) 14 résultats

- Gastronomique (Restaurants) 19 résultats

- Grillades (Restaurants) 34 résultats

- Originaux (Restaurants) 33 résultats

- Pizzerias (Restaurants) 94 résultats

- Restauration à domicile (Restaurants) 23 résultats

- Restauration rapide (Restaurants) 22 résultats

- Spécialités étrangères (Restaurants) 74 résultats

- Spécialités françaises (Restaurants) 33 résultats

- Spécialités Régionales (Restaurants) 23 résultats

- Traditionnels (Restaurants) 148 résultats

- Traiteurs (Restaurants) 85 résultats

Jusqu'ici c'est simple de la faire en plusieurs requetes imbriquees mais ce
n'est pas possible car cette algorithme de recherche doit servir aussi pour
ce qui va suivre .

On aurait pu faire :

1] Select toutes les sous-categories where id_categorieR dans sscategorie
2] select count de l'index de la sous categorie
{ écrire le résultat}
2'] movenext
1'] movenext

Mais ce la ne va pas car c'est trop long , la table contient en realite
plusieurs milliers d'enregistrements a filtrer
Donc les boucles ne sont pas trop recommandées

Et aussi du fait que l'on peut aussi passer en paramètre un critère de
recherche (mot(s)-clé(s))supplémentaire du type STRING qui devra, lui, en
plus de parcourir dans cette requette :
Les champs suivants :

Commerce.nom_commerce
Commerce.description_commerce
Categorie.nom_categorie
Categorie.motcles_categorie
SsCategorie.nom_SsCategorie


Voila le probleme, ce qui tend à optimiser la recherche en utilisant des
'XOR' pour chacun des criteres ci-dessus, ne fait en fait que la compliquer

Je dois donc pour eviter des ralentissements de l'ordre de 10 a 15 secondes
par recherche comme j'avais auparavant , trouver un algorithme qui puisse
supporter tous ces paramètres en un seul passage, tout en tenant compte du
fait que les deux parametres peuvent interagir ensemble ou séparement !!!!!
(1 et 1 ,1 et 0,0 et 1)


Merci de votre aide

Fred




Avatar
jmn
Cher Fred,
ne vous embêtez pas avec ça ! Votre problème est tout à fait classique
(basique ?) et se plonge dans la classe des comptages dans une base de
données relationnelle.

Vous devez étudiez les clauses Count, Group by et les jointures pour
répondre à votre besoin.
Count(nom_de_champ) pour compter vos boutiques
group by pour déterminer les sous ensembles à compter
join pour lier les tables entre elles...

par exemple, sans reprendre vos noms de variables :

select count(id_boutique) as nbr, categories.libcategorie,
souscategorie.libsouscategorie from (boutiques left join sous_categorie on
boutique.code_categorie=sous_categorie.code_categorie and
boutique.code_souscategorie=sous_categorie.code_souscategorie) left join
boutique.code_categorieÊtegorie.code_categorie where <vos critères
s'appliquant sur une des trois tables> group by categories.libcategorie,
souscategorie.libsouscategorie