Requette SQL de synthese

BrunoForum
Invité n'ayant pas de compte PHPfrance

10 Déc 2016, 09:44

Bonjour à tous,

Tout nouveau sur ce forum je fais appel à vous car je bute un peu sur cette requette SQL.

Dans le cadre de deux tables ( Tables de Vérification 1 et 2) (remplis par le nom d'un verificateurs pour un champ testé), je recherche la requette SQL qui permettrait, à partir de ces deux tables suivantes ( Table de Vérification 1 er 2), de générer la table synthèse de vérification donnée en exemple

Table de Verification 1:

DATE | Champ1_verifié
--------------------------------
20/08/2018 | Patrick
21/08/2018 | Paul


Table de Verification 2:

DATE | Champ2_verifié
--------------------------------
21/08/2018 | Paul
22/08/2018 | Cyril


TABLE de Synthèse des Vérifiations:

DATE | Champ1_verifié| Champ2_verifié
------------------------------------------------
20/08/2018 | Patrick |
21/08/2018 | Paul | Paul
22/08/2018 | | Cyril


J'ai bien essayé avec de rechercher sur internet et tenté de bricoler des requettes avec des unions ou des jointures, mais je n'arrive pour l'heure, pas au résultat désiré.

Quelque pourrait t'il me donner un bout de piste ou saurait il m'aider ? Idéalement me proposer une solution en une seule requette (car je pense bien que je n'invente pas ici pas l'eau chaude) et qu'il doit bien exister une technique avec des requettes adaptées à ce cas

D'avance merci à tous pour vos réponses

Bruno

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8503 Messages

12 Déc 2016, 15:51

salut,

il faudrait faire un select * table1, table2, mais c'est scabreux.

ce que je vois là ressemble à un problème de modélisation de la base. Il ne faut pas une table par champ mais une table avec les champs et une avec les vérifications qui auras deux clef étrangère vers la table des utilisateurs et celle des champs (et une date).

cela va te simplifier la vie grandement.
exemple de MCD
mcd_brunoForum.png


ce qui donne le code SQL suivant https://gist.github.com/anonymous/4ca16 ... 086d125825

avec cela la requête pour avoir les informations sur tout les champs est simple

select champ_lib, user_name, date_verification from Champs_verifie 
join Users using(user_id)
join Champs using(champ_id)


ensuite pour l'affichage horizontale comme tu le souhaite il faut traiter une peu le résultat de la requête pour avoir un tableau contenant les données avec en index les libellés.
par exemple
<?php
$libelle = ['champ1','champ2' ...];
$data = [ 'champ1' => [['user_name'=> 'pierre','date_verification'=> '12/12/2016'] ] ,
'champ2' => [ ['user_name'=> 'pierre','date_verification'=> '12/12/2016'],['user_name'=> 'paul','date_verification'=> '12/11/2016'] ]];

il te faut aussi toute les dates de vérification dans un tableau (avec mon exemple de table : select distinct date_verification from champ_verifie )
<?php
$libelle = ['champ1','champ2'];
$data = [ 'champ1' => [['user_name'=> 'pierre','date_verification'=> '12/12/2016'] ] ,
'champ2' => [['user_name'=> 'pierre','date_verification'=> '12/12/2016'],['user_name'=> 'paul','date_verification'=> '12/11/2016']]];
$data = [];
// les dates sont dans $dates
echo '<table><thead><tr><th>date</th><th>';
echo implode($libelle,'</th><th>');
echo '</tr></thead><tbody>';
foreach($dates as $d) {
echo '<tr><td>',$d,'</td>';
foreach($libelle as $l) {
if(!empty($data[$l])){
$current = getData($data[$l],$d);
echo '<td>';
if(!empty($current)){
echo $current;
}
echo '</td>';
}
}
echo '</tr>';
}
echo '</tbody></table>';


function getData ($data,$date){
foreach ($data as $value) {
if($value['date_verification'] == date){
return $value['user_name'];
}
}
return null;
}


C'est à tester, mais le principe est la. Ceci ne fonctionne que si un champ n'est vérifiable que par une seule personne (ma structure sql permet plusieurs vérificateurs).

Dans tous les cas il faut trouver les données correspondant à chaque case. évite une requête SQL pour chaque case cela va vite être anti-performant.

ps or mis l'union est la jointure (ou from pulti table) il n'y a pas trop de solution SQL. Après il faut passer par une UDF (fonction utilisateur sur le SGBD) qui va retourner un curseau avec un jeux de résultat que tu auras en forme pour avoir ce que tu veux.

@+
Vous ne pouvez pas consulter les fichiers insérés à ce message.
Il en faut peu pour être heureux ......