Bonjour.
OK, le titre n'est pas éloquent, mais je n'avais rien de plus accrocheur ...
Je vais solliciter votre aide car, pour reprendre une phrase de film célèbre : "J'ai la cervelle en sauce blanche" (Ghostbuster pour les incultes)
J'ai une requête qui m'a demandé quelques nœuds au cerveau :
(Pour être plus précis, il s'agit d'une fonction que j'appelle avec x paramètres. Aussi ne vous formalisez pas des WHEN 0 = 0, il s'agit d'un forçage des paramètres pour ne pas passer par la fonction pour pouvoir faire des tests + rapides sous pgAdmin).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 SELECT DISTINCT documents.id_document, documents.code1, documents.code2, documents.code3, documents.titre, documents.indice, documents.commentaires, documents.fichier_pdf, documents.fichier_source, documents.nb_affaire, etats.etat FROM types INNER JOIN ((((marches INNER JOIN (etats INNER JOIN documents ON etats.id_etat = documents.id_etat) ON marches.id_marche = documents.id_marche) LEFT OUTER JOIN mots_clef ON documents.id_document = mots_clef.id_document) LEFT OUTER JOIN documents_affaires ON documents.id_document = documents_affaires.id_document) INNER JOIN documents_types ON documents.id_document = documents_types.id_document) ON types.id_type = documents_types.id_type WHERE ( (documents.code1 ILIKE 'Ref1' OR documents.code2 ILIKE 'Ref1' OR documents.code3 ILIKE 'Ref1') --<-param1 AND (documents.titre ILIKE '%' OR documents.commentaires ILIKE '%' OR mots_clef.mot_clef ILIKE '%') --<-param2 AND marches.marche ILIKE '%' --<-param3 ) AND -- Si $4 = 0, c'est que la recherche pointe sur <Tous> les types de documents 1 = CASE WHEN 0 = 0 THEN 1 --<-param4 WHEN types.id_type = 0 THEN 1 --<-param4 ELSE 0 END AND -- Si $6 = 0 c'est que la recherche ne pointe sur aucune affaire 1 = CASE WHEN 0 =0 THEN 1 --<-param6 WHEN documents_affaires.id_affaire = 0 THEN 1 --<-param6 ELSE 0 END ORDER BY code1 ASC;
De plus, désolé pour l'indentation, j'avoue que l'essentiel de la requête a été générée par un soft et que j'ai du mal à démêler les jointures.
Petites explications :
J'ai plusieurs tables:
- 'documents' : liste de documents
- 'affaires' (un document peut avoir aucune ou plusieurs affaires, une affaire peut avoir aucun ou plusieurs documents)
- 'types' (un document doit avoir au moins un type, un type peut avoir aucun ou plusieurs document)
- 'etat' (un document doit avoir un seul état, un état peut avoir aucun ou plusieurs documents)
- 'mots_clefs' (un document peut avoir aucun ou plusieurs mots_clef, un mot_clef doit avoir un seul document)
- 'marches' (un document doit avoir un seul marché, un marché peut avoir plusieurs ou aucun document)
Pour lier tout ça, j'ai 2 tables de liens (excusez si le terme est impropre, j'ai pas fais SQL 1ère langue)
- 'documents_affaires'
- 'document_type'
Actuellement, la fonction... fonctionne. Je récupère bien avec ma requête les info qui m'intéressent :
En fonction de divers paramètre(param) , je récupère une liste d'enregistrement (normal me direz-vous).
J'aimerais ajouter une colonne au résultat de la requête correspondant au nombre d'enregistrement ayant l'id_document présents dans la table 'documents_affaires'.
Exemple :
la requete trouve 10 enregistrements, je voudrait que pour chaque enregistrement, elle récupère l'id_document (c'est déjà le cas) et qu'elle aille compter le nombre de lignes qui se trouvent dans la table 'documents_affaires' avec le même id_document.
Je ne pense pas que cela soit très compliqué, une histoire de COUNT(*), mais j'avoue que je sèche. La journée a été longue, c'est peut-être ça ...
Merci de votre aide bienvenue.
PS : j'ai omis de préciser que j'étais newbie en programmation (automaticien à la base), idem en SQL, encore plus en PostgreSQL. Des réponses simples, voir un petit exemple seraient vraiment appréciés si vous voulez pas me perdre trop vite![]()
Partager