salut a tous, pour optimiser une application, je voudrais créer une vue ...
évitons les discours, j'ai fais un montage simplifié, le but est d'atteindre "ma_vue" sur ce montage
Merci de m'aider un peu. bonne journée a tous.
salut a tous, pour optimiser une application, je voudrais créer une vue ...
évitons les discours, j'ai fais un montage simplifié, le but est d'atteindre "ma_vue" sur ce montage
Merci de m'aider un peu. bonne journée a tous.
bonjour,
Sur quel point bloquez vous en fait ?
"ma_vue" est un montage photoshop, je n'arrive pas a creer les champs nb1, go, nb2, lot, en fait, j'arrive a pas grand chose :-(
Salut!
As-tu déjà essayé de faire une requête qui te retourne ce que tu veux?
Pour le moment je fait en php :
-----------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from reserves
puis ds le while
-----------------------------------
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 "select count(donnees_sup.valeur) as nb, donnees_sup.valeur from donnees_sup inner join champs on donnees_sup.id_champs=champs.id where champs.id_type_champs=1 and id_reserves=".$row['id']
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 "select count(donnees_sup.valeur) as nb, donnees_sup.valeur from donnees_sup inner join champs on donnees_sup.id_champs=champs.id where champs.id_type_champs=2 and id_reserves=".$row['id']
Bonjour,
Ne jamais remplacer une requête SQL avec des jointures par des boucles vous allez écrouler votre serveur MySQL !!!
Si toutes vos tables sont lié (relation clé primaire, clé étrangère ou autre) il vous suffit de faire une jointure entre chaque table.
Je pense que cette requête doit correspondre à ce que vous attendez. Par contre il n'est pas possible de regrouper sur une seul ligne tout les information pour un id de la table reserves (dans votre exemple nb1 et nb2 sont sur la même ligne, dans ma requête pour chaque type_champs une nouvelle ligne est créé, il est "impossible" de le faire en une seul requête SQL).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT r.id , c.type_champs, ds.valeur, count(ds.valeur) as nb FROM reserve r INNER JOIN donnees_sup ds ON r.id = ds.id_reserves INNER JOIN champs c ON ds.id_champs = c.id GROUP BY r.id, c.type_champs, ds.valeur
Pour créer la vue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE VIEW maVue AS SELECT ...
une réponse vous a permis d'avancer ?
Que donne cette requête (non testée) ?
PS : Le * est à remplacer par la liste des colonnes évidemment.
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 SELECT r.*, t2.nb_1, t2.libelle_1, t2.nb_2, t2.libelle_2 FROM reserve r JOIN donnees_sup ds ON ds.id_reserves = r.id join (select v.id_champs, t.min_id, max(case when c.id_type_champs = 1 then t.nb end) as nb_1, max(case when c.id_type_champs = 1 then t.valeur end) as libelle_1, max(case when c.id_type_champs = 2 then t.nb end) as nb_2, max(case when c.id_type_champs = 2 then t.valeur end) as libelle_2 from valeurs v join (select id_champs, min(id) as min_id, count(*) as nb from valeurs group by id_champs) t on t.id_champs = v.id_champs and t.min_id = v.min_id join champs c on c.id = t.id_champs group by v.id_champs, t.min_id ) t2 on t2.id_champs = ds.id_champs and t2.min_id = ds.valeur
j'obtient le message suivant.
Unknown column 't.valeur' in 'field list'
mais l'esprit a l'air super, ... et me depasse un peu ...
j'ai ajouté "valeur" ds les champs de la jointure mais la j'ai :
Unknown column 'v.min_id' in 'on clause'
-----------------------
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 SELECT r.id,r.id_projet,r.nb_reserve_val,r.nb_reserve_lib,r.titre,r.type,r.niveau_criticite, t2.nb_1, t2.libelle_1, t2.nb_2, t2.libelle_2 FROM reserves r JOIN donnees_sup ds ON ds.id_reserves = r.id JOIN (SELECT v.id_champs, t.min_id, max(case when c.id_type_champs = 1 then t.nb end) AS nb_1, max(case when c.id_type_champs = 1 then t.valeur end) AS libelle_1, max(case when c.id_type_champs = 2 then t.nb end) AS nb_2, max(case when c.id_type_champs = 2 then t.valeur end) AS libelle_2 FROM valeurs v JOIN (SELECT id_champs, min(id) AS min_id, count(*) AS nb, valeur FROM valeurs GROUP BY id_champs) t ON t.id_champs = v.id_champs AND t.min_id = v.min_id JOIN champs c ON c.id = t.id_champs GROUP BY v.id_champs, t.min_id ) t2 ON t2.id_champs = ds.id_champs AND t2.min_id = ds.valeur
C'est v.valeur qu'il faut utiliser :
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 SELECT r.*, t2.nb_1, t2.libelle_1, t2.nb_2, t2.libelle_2 FROM reserve r JOIN donnees_sup ds ON ds.id_reserves = r.id join (select v.id_champs, t.min_id, max(case when c.id_type_champs = 1 then t.nb end) as nb_1, max(case when c.id_type_champs = 1 then v.valeur end) as libelle_1, max(case when c.id_type_champs = 2 then t.nb end) as nb_2, max(case when c.id_type_champs = 2 then v.valeur end) as libelle_2 from valeurs v join (select id_champs, min(id) as min_id, count(*) as nb from valeurs group by id_champs) t on t.id_champs = v.id_champs and t.min_id = v.id join champs c on c.id = t.id_champs group by v.id_champs, t.min_id ) t2 on t2.id_champs = ds.id_champs and t2.min_id = ds.valeur
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager