Utilisation de Jointure Right ou Left?

Eléphant du PHP | 440 Messages

27 janv. 2009, 17:30

Bonjour à tous,

j'ai une question:
Table question

Code : Tout sélectionner

CREATE TABLE `qt_audit` ( `id_qt_audit` int(11) NOT NULL auto_increment, `id_audit` int(11) NOT NULL, `question_qt_audit` text NOT NULL, `id_coefficient_hygiene` int(11) NOT NULL, `id_coefficient_securite` int(11) NOT NULL, `id_coefficient_environnement` int(11) NOT NULL, `id_critere_audit` int(11) NOT NULL, `id_scritere_audit` int(11) NOT NULL, PRIMARY KEY (`id_qt_audit`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; -- -- Contenu de la table `qt_audit` -- INSERT INTO `qt_audit` (`id_qt_audit`, `id_audit`, `question_qt_audit`, `id_coefficient_hygiene`, `id_coefficient_securite`, `id_coefficient_environnement`, `id_critere_audit`, `id_scritere_audit`) VALUES (1, 1, 'ggsdgdfgdfgdfg sfg dfg sdf gdf g fgs d g fsd', 1, 2, 3, 1, 11), (2, 1, 'tdhgjkjkh khkj kjhkjhhjkhkkjhkj hkj kh', 2, 1, 4, 1, 11), (4, 1, 'tdhgjkjkh khkj kjhkjhhjkhkkjhkj hkj kh', 4, 5, 5, 3, 22), (9, 1, 'tettetetet', 2, 3, 4, 1, 1), (6, 1, 'tdhgjkjkh khkj kjhkjhhjkhkkjhkj hkj kh', 3, 2, 2, 1, 7), (7, 1, 'kkkkkkkkkkkkkw vfdgkddgfd gfdgdfgfdkg fdgdfkgfd kg fdgdkgdwgdgdf', 1, 1, 1, 1, 3), (8, 1, 'kkkkkkkkkkkkkw vfdgkddgfd gfdgdfgfdkg fdgdfkgfd kg fdgdkgdwgdgdf', 3, 3, 3, 2, 13);
Table reponse:

Code : Tout sélectionner

Structure de la table `rps_audit` -- CREATE TABLE `rps_audit` ( `id_rps_audit` int(11) NOT NULL auto_increment, `id_client_audit` int(11) NOT NULL, `id_qt_audit` int(11) NOT NULL, `rps_rps_audit` int(2) NOT NULL, `commentaire_rps_audit` text NOT NULL, PRIMARY KEY (`id_rps_audit`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; -- -- Contenu de la table `rps_audit` -- INSERT INTO `rps_audit` (`id_rps_audit`, `id_client_audit`, `id_qt_audit`, `rps_rps_audit`, `commentaire_rps_audit`) VALUES (1, 1, 1, 8, ''), (2, 1, 2, 4, 'ihuihiuhiuhiuhi'), (3, 1, 4, 1, 'uhiuiuhuuiiu'), (4, 1, 6, 1, 'hjhjhjh'), (5, 1, 8, 4, 'uhhuhikhui');
Client audit:

Code : Tout sélectionner

CREATE TABLE `client_audit` ( `id_client_audit` int(11) NOT NULL auto_increment, `id_audit` int(11) NOT NULL, `id_client` int(11) NOT NULL, `date_client_audit` date NOT NULL, `heure_client_audit` time NOT NULL, `auteur_client_audit` varchar(32) NOT NULL, `status_client_audit` tinyint(1) NOT NULL, PRIMARY KEY (`id_client_audit`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; -- -- Contenu de la table `client_audit` -- INSERT INTO `client_audit` (`id_client_audit`, `id_audit`, `id_client`, `date_client_audit`, `heure_client_audit`, `auteur_client_audit`, `status_client_audit`) VALUES (1, 1, 1, '2008-11-21', '12:12:00', 'BBBBBBBBBBBBbb ', 0);
Client audit

Code : Tout sélectionner

Structure de la table `information_audit` -- CREATE TABLE `information_audit` ( `id_audit` int(11) NOT NULL auto_increment, `titre_audit` varchar(32) NOT NULL, `version_audit` int(11) NOT NULL, `date_audit` date NOT NULL, `code_audit` varchar(32) NOT NULL, `point_satisfaisant_audit` int(1) default NULL, `point_aameliorer_audit` int(1) default NULL, `point_nonsatisfaisant_audit` int(1) default NULL, `status_audit` tinyint(1) NOT NULL, PRIMARY KEY (`id_audit`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; -- -- Contenu de la table `information_audit` -- INSERT INTO `information_audit` (`id_audit`, `titre_audit`, `version_audit`, `date_audit`, `code_audit`, `point_satisfaisant_audit`, `point_aameliorer_audit`, `point_nonsatisfaisant_audit`, `status_audit`) VALUES (1, 'test1', 1, '2009-01-22', '1', 8, 4, 1, 0);
Voici mes tables:

Information audit est la table regroupement les informations de l'audit (le titre, version date, le nombre de point pour les 3 réponses autoriser).
qt_audit se sont les questions avec leur coeff pour les 3 réponses.
(Qt_audit est lié avec information audit par id_audit)

Client_audit est la table qui indique les informations sur l'audit réaliser sur XXX client. (Date, quel audit on utilise de l'information_audit).

rps_audit ici on stocke les résultat des réponses (la note , id_qt_audit, commentaire)

et je voudrait réaliser une requête comme ceci:

Code : Tout sélectionner

SELECT rps_audit.id_qt_audit, SUBSTRING(question_qt_audit,1,100)as question_qt_audit, id_rps_audit, nom_critere_audit, ca.id_critere_audit, nom_scritere_audit, sca.id_scritere_audit, point_satisfaisant_audit,point_aameliorer_audit, point_nonsatisfaisant_audit, rps_rps_audit, commentaire_rps_audit FROM rps_audit LEFT JOIN qt_audit ON qt_audit.id_qt_audit=rps_audit.id_qt_audit INNER JOIN information_audit ON information_audit.id_audit=qt_audit.id_audit INNER JOIN critere_audit ca ON ca.id_critere_audit=qt_audit.id_critere_audit INNER JOIN scritere_audit sca ON sca.id_scritere_audit=qt_audit.id_scritere_audit WHERE id_client_audit='1' ORDER BY nom_critere_audit, nom_scritere_audit
Je voudrait tout les questions et les réponses ou id_client_audit est à "1" et je voudrait aussi qu'il m'affiche aussi les questions qui ne n'ont pas de réponse . Je sais qu'il faut utiliser Left ou Right Join mais je but :(.

Si quelqu'un pourrait m'éclairer je suis preneur.

Merci par avance

guigui69

Eléphant du PHP | 440 Messages

16 mars 2009, 10:54

Je revient vers vous car je but toujours sur ma requête

Code : Tout sélectionner

TABLE Info_audit: id_audit TABLE question: id_qt_audit,etc..... TABLE client_info: id_client_audit id_audit id_client TABLE rps_audit: id_rps_audit id_client_audit id_qt_audit
Je n'arrive pas a concevoir ma requête, j'arrive a affiché les questions réponses... mais je n'arrive pas a dire a ma requête d'afficher aussi les questions sans réponse.

Code : Tout sélectionner

SELECT SUBSTRING(question_qt_audit,1,100)as question_qt_audit, rps_rps_audit, commentaire_rps_audit FROM rps_audit ra RIGHT JOIN qt_audit qt ON qt.id_qt_audit=ra.id_qt_audit INNER JOIN client_audit ca ON ca.id_audit=qt.id_audit WHERE ca.id_client_audit =1

SI quelqu'un pourrait m'eclairer. Je suis preneur.

guigui69

Eléphant du PHP | 353 Messages

16 mars 2009, 11:06

A première vue je dirais que ta requete ne cible pas la bonne table en fait.

tu fais :

Code : Tout sélectionner

FROM rps_audit ra RIGHT JOIN qt_audit qt ON qt.id_qt_audit=ra.id_qt_audit

Ce qui revient à sélectionner toutes les réponses aux questions.

pourquoi ne pas faire ceci :

Code : Tout sélectionner

SELECT SUBSTRING(question_qt_audit,1,100)as question_qt_audit, rps_rps_audit, commentaire_rps_audit FROM qt_audit qt LEFT JOIN rps_audit ra ON (qt.id_qt_audit = ra.id_qt_audit AND ca.id_client_audit =1 ) LEFT JOIN client_audit ca ON (ca.id_audit=qt.id_audit)
Ce n'est qu'une sugestion, mais cela devrait déjà mieux correspondre à ce que tu attends

Eléphant du PHP | 440 Messages

16 mars 2009, 11:40

Merci pour ta réponse. J'ai fait des essais mais mes résultat ne sont pas concluant. (J'ai modifier un paramètre sinon la requête ne fonctionnait pas du tout)

Code : Tout sélectionner

SELECT SUBSTRING(question_qt_audit,1,100)as question_qt_audit, rps_rps_audit, commentaire_rps_audit FROM qt_audit qt LEFT JOIN rps_audit ra ON (qt.id_qt_audit = ra.id_qt_audit AND [b]ra.id_client_audit =1[/b] ) LEFT JOIN client_audit ca ON (ca.id_audit=qt.id_audit)

Il me retourne ceci:

Code : Tout sélectionner

id_qt_audit Croissant question_qt_audit rps_rps_audit commentaire_rps_audit 1 1 8 1 1 8 2 2 4 ihuihiuhiuhiuhi 2 2 4 ihuihiuhiuhiuhi 4 4 1 uhiuiuhuuiiu 4 4 1 uhiuiuhuuiiu 6 6 1 hjhjhjh 6 6 1 hjhjhjh 7 7 NULL NULL 7 7 NULL NULL 8 8 4 uhhuhikhui 8 8 4 uhhuhikhui 9 9 NULL NULL 9 9 NULL NULL 10 10 NULL NULL 11 11 NULL NULL 12 12 NULL NULL 13 13 NULL NULL

J'ai essayer cette requête: (En me basant sur la tienne)

Code : Tout sélectionner

SELECT qt.id_qt_audit,SUBSTRING(question_qt_audit,1,100)as question_qt_audit, rps_rps_audit, commentaire_rps_audit FROM qt_audit qt LEFT JOIN rps_audit ra ON (qt.id_qt_audit = ra.id_qt_audit AND ra.id_client_audit =4 ) LEFT JOIN client_audit ca ON (ca.id_audit=qt.id_audit) WHERE qt.id_audit='1' AND ca.id_client_audit =4
Je comprend pas cette ligne
LEFT JOIN rps_audit ra ON (qt.id_qt_audit = ra.id_qt_audit AND ra.id_client_audit =4 )

Merci pour ton aide

guigui69

Eléphant du PHP | 353 Messages

16 mars 2009, 11:46

autant pour moi.
J'ai mal copié ce qu'il fallait faire .
En fait il faudrait faire ceci :

Code : Tout sélectionner

SELECT SUBSTRING(question_qt_audit,1,100)as question_qt_audit, rps_rps_audit, commentaire_rps_audit FROM qt_audit qt LEFT JOIN rps_audit ra ON (qt.id_qt_audit = ra.id_qt_audit) INNER JOIN client_audit ca ON (ca.id_audit = qt.id_audit)
Est ce que cela fonction mieux ?
Et si ce n'est pas le cas, qu'est ce qui ne fonctionne pas correctement au juste ?

Eléphant du PHP | 440 Messages

16 mars 2009, 12:13

Cela ne fonctionne pas, il me retourne des résultats mais pas les bons.


Moi aussi au départ j'avais essayé cette requête, mais cela ne fonctionne pas (il me retourne des résultat mais pas les bons)

Ce qui ne fonctionne pas correctement c'est que je n'arrive pas a afficher les questions qui non pas de reponse en fonction de l'id_client_audit

Le fonctionnement est le suivant:

Table Info audit qui elle a ID_AUDIT
Table Qt_audit qui elle a ID_QT_audit et id_audit (pour lié les questions à l'audit)
Table Client_audit qui elle à ID_client_audit, id_audit (pour indiqué quel audit on utiliser) et ID_client (pour le client en question)
Table rps_audit qui elle contient ID_rps_audit, id_client_audit (pour lié les réponse a quel client audit) et ID_qt_audit (pour lié les réponses au question).

Et donc je voudrait retourner les questions (même les questions qui non pas de réponses)et les réponses etc par rapport à la ou l'id_client_audit = XX.

Merci

guigui69

__________________________________________
Maj j'ai réalisé ceci comme requete est que cela te parrait correcte.

Code : Tout sélectionner

SELECT SUBSTRING(question_qt_audit,1,100)as question_qt_audit, qt.id_qt_audit, id_audit, ra.id_client_audit, rps_rps_audit, commentaire_rps_audit FROM qt_audit qt LEFT JOIN rps_audit ra ON qt.id_qt_audit = ra.id_qt_audit AND ra.id_client_audit= 5 WHERE id_audit='1'
Merci d'avance pour vos réponses.

guigui69