SQL - Comment définir des variables et
phenetas
Messages postés
1108
Date d'inscription
Statut
Membre
Dernière intervention
-
phenetas Messages postés 1108 Date d'inscription Statut Membre Dernière intervention -
phenetas Messages postés 1108 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai une base SQL avec deux tables. L'une est une liste de station d'accueil, l'autre est une liste d'objets associés à ces stations d'accueil.
Les objets associés aux stations d'accueil sont de deux types "A" et "B".
Mon but est de savoir pour chaque station d'accueil, si elle n'a :
- que des objets "A" associés
- OU que des objets "B" associés
- OU des objets "A" ET "B" associés
Exemple :
Table objet
Table objet
Ce que je voudrais c'est un output qui me donnerait :
Station 1 : uniquement des objets "A"
Station 2 : des objets "A" ET "B"
Station 3 : uniquement des objets "B"
Station 4 : uniquement des objets "A"
Je saurais faire l'algorithme et en PHP par exemple, malheureusement je n'ai accès ici qu'au SQL.
Je me rend compte que tout n'est pas possible en SQL, comme par exemple les boucles FOR.
Avez vous svp des pistes pour attaquer ce problème ?
D'avance merci
J'ai une base SQL avec deux tables. L'une est une liste de station d'accueil, l'autre est une liste d'objets associés à ces stations d'accueil.
Les objets associés aux stations d'accueil sont de deux types "A" et "B".
Mon but est de savoir pour chaque station d'accueil, si elle n'a :
- que des objets "A" associés
- OU que des objets "B" associés
- OU des objets "A" ET "B" associés
Exemple :
Table objet
id | nom_station
1 station1
2 station2
3 station3
4 station4
Table objet
ID_base | nom_objet
1 A
2 A
1 A
2 B
3 B
4 A
Ce que je voudrais c'est un output qui me donnerait :
Station 1 : uniquement des objets "A"
Station 2 : des objets "A" ET "B"
Station 3 : uniquement des objets "B"
Station 4 : uniquement des objets "A"
Je saurais faire l'algorithme et en PHP par exemple, malheureusement je n'ai accès ici qu'au SQL.
Je me rend compte que tout n'est pas possible en SQL, comme par exemple les boucles FOR.
Avez vous svp des pistes pour attaquer ce problème ?
D'avance merci
A voir également:
- SQL - Comment définir des variables et
- Définir google comme page d'accueil - Guide
- Definir foyer - Accueil - Guide streaming
- Logiciel sql - Télécharger - Bases de données
- Définir retrait - Guide
- Definir ecran principal windows - Forum Windows 10
2 réponses
Bonjour,
J'ai pas trop réfléchi mais si j'ai bien compris, tu pourrais faire des COUNT de nom_objet (HAVING nom_objet='A' ou 'B' selon) et ce pour chacun des ID_base ce qui te permettrait de savoir combien d'objets A ou B chaque station possède.
J'ai pas trop réfléchi mais si j'ai bien compris, tu pourrais faire des COUNT de nom_objet (HAVING nom_objet='A' ou 'B' selon) et ce pour chacun des ID_base ce qui te permettrait de savoir combien d'objets A ou B chaque station possède.
Bonjour,
Le SQL n'a pas besoin de boucles FOR :)
Tu peux réaliser ce que tu veux en une seule requête bien écrite.
Par exemple, quelque chose comme ça :
Pour obtenir le texte résumé, tu peux effectivement réutiliser cette requête comme sous-requête, faire un GROUP BY types_objets avec des COUNT :
Note que cette façon de faire convient tant que tu ne rajoutes pas de nouveaux types d'objets... Cela deviendra plus compliqué si on ne connait pas les types d'objets possibles.
Xavier
Le SQL n'a pas besoin de boucles FOR :)
Tu peux réaliser ce que tu veux en une seule requête bien écrite.
Par exemple, quelque chose comme ça :
SELECT id, nom_station, CASE WHEN nbA = 0 AND nbB = 0 THEN 'Aucun objet' WHEN nbA = 0 AND nbB > 0 THEN 'Que des B' WHEN nbA > 0 AND nbB = 0 THEN 'Que des A' ELSE 'Des A et des B' END as types_objets FROM ( SELECT s.id, s.nom_station, SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'A' THEN 1 ELSE 0 END) as nbA, SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'B' THEN 1 ELSE 0 END) as nbB FROM stations s LEFT OUTER JOIN objet o ON o.id_base = s.id GROUP BY s.id, s.nom_station ) as n
Pour obtenir le texte résumé, tu peux effectivement réutiliser cette requête comme sous-requête, faire un GROUP BY types_objets avec des COUNT :
SELECT types_objets, count(*) FROM ( SELECT id, nom_station, CASE WHEN nbA = 0 AND nbB = 0 THEN 'Aucun objet' WHEN nbA = 0 AND nbB > 0 THEN 'Que des B' WHEN nbA > 0 AND nbB = 0 THEN 'Que des A' ELSE 'Des A et des B' END as types_objets FROM ( SELECT s.id, s.nom_station, SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'A' THEN 1 ELSE 0 END) as nbA, SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'B' THEN 1 ELSE 0 END) as nbB FROM stations s LEFT OUTER JOIN objet o ON o.id_base = s.id GROUP BY s.id, s.nom_station ) as n ) as resume GROUP BY types_objets
Note que cette façon de faire convient tant que tu ne rajoutes pas de nouveaux types d'objets... Cela deviendra plus compliqué si on ne connait pas les types d'objets possibles.
Xavier
Et pour aller plus loin j'aimerais avoir un résumé du genre :
Il y a X stations avec des objets "A" ET "B"
Il y a Y stations avec des objets "A" uniquement
Il y a N stations avec des objets "B" uniquement
J'imagine que je vais devoir utiliser un COUNT sur les résultats de la requête précédente ?