[resolu]problème avec inner join

Mammouth du PHP | 790 Messages

11 oct. 2011, 15:57

bonjour a tous,
ce poste est un peut la suite de celui ci: php-debutant/requete-une-comment-faire-t260658.html

tout a bien fonctionner et j'ai compris le principe mais maintenant je dois créer une jointure avec une autre table: calcul
pour le moment j'en suis la:
<?php
// Connexion à la base de données
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=malivote', 'root', '', $pdo_options);
    
    // Récupération info pere
    $req = $bdd->prepare('SELECT
							 ce.photo          AS photo_chien,
							 ce.lof            AS lof_chien,
							 ce.sex            AS sex_chien,
							 ce.poids          AS poids_chien,
							 ce.nom            AS nom_chien,
							 ce.race           AS race_chien,
							 ce.affixe         AS affixe_chien,
							 ce.id             AS id_chien,
							 ce.description    AS description_chien,
							 ce.proprio_text   AS proprio_text_chien,
							 ce.lof_pere       AS lof_pere_chien,
							 ce.lof_mere       AS lof_mere_chien,
							 						 
							 cp.lof            AS lof_pere,
							 cp.lof_pere       AS lof_pere_pere,
							 cp.lof_mere       AS lof_mere_pere,
   							 cp.id             AS id_pere,
							 cp.nom            AS nom_pere,
							 cp.affixe         AS affixe_pere,
							 cp.photo          AS photo_pere,
							
							 cm.lof            AS lof_mere,
							 cm.lof_pere       AS lof_pere_mere,
							 cm.lof_mere       AS lof_mere_mere,							 
     						 cm.id             AS id_mere,
							 cm.nom            AS nom_mere,
							 cm.affixe         AS affixe_mere,
							 cm.photo          AS photo_mere,	

							 rs.id			   AS id_vote
							 
							 
							 FROM chien        AS    ce
							 
							 LEFT JOIN chien AS  cp ON ce.lof_pere = cp.lof
							 LEFT JOIN chien AS  cm ON ce.lof_mere = cm.lof
							 
							 INNER JOIN calcul AS rs ON cp.id = rs.id
							 						 
							 
						WHERE ce.id = ? ');
    $req->execute(array($_GET['pedigre']));
    $donnees = $req->fetch();
    ?>
je pense que je suis sur la bonne route car ça ne me retourne aucune erreur...
inner join de la table calcul contient des résultats de vote de plusieurs questions enregistrer comme ceci id+n°de question
ex: i-A et il i a plusieurs questions: (A) (B) (C) (D) (E)...

comment faire dans le "INNER JOIN calcul AS rs ON cp.id = rs.id" pour renseigné l'id + la lettre de la question ?

j’espère que je m'explique bien, merci d’avance.
Modifié en dernier par juliette le 18 oct. 2011, 23:26, modifié 1 fois.
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

11 oct. 2011, 16:16

Tu peux cumuler des conditions de la sorte :
ON (condition1 AND condition2)

Mammouth du PHP | 790 Messages

11 oct. 2011, 16:28

du coup ça m’amène a d'autre questions, j'ai déjà fait des des jointures sur la même table "LEFT JOIN" et maintenant je veux joindre une autre table:
est bien INNER JOIN dans mon cas ?

au cas ou un tuto serais cool, merci #-o
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

11 oct. 2011, 17:10

AS-tu regardé le tuto sur les jointures de bases dans la FAQ ? ça va t'éclairer sur les principes fondamentaux. Ensuite, il y a un autre tuto, un peu plus avancé et beaucoup plus complet sur developpez.com, met « jointures » et « sqlpro » dans Google, tu ne devrais pas avoir de mal à le trouver, et j'ajoute que SqlPro (pseudo de l'auteur du tuto) est vraiment un pro du SQL, il n'est pas passé souvent ici à mon grand regret, mais comme tu vois on sait où le trouver si nécessaire ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

11 oct. 2011, 18:31

tu avais raison, jetait a coté de la plaque... j'ai repris a zero et je pense que c'est bon:
SELECT 
								ce.id                 AS id_chien,
								ce.nom             AS nom_chien,
								ce.affixe          AS affixe_chien,
								
								cl.id                   AS id_calcul,
								cl.total_votes     AS votes_calcul,
								cl.total_value     AS value_calcul
							
								
						FROM chien AS ce
						INNER JOIN calcul AS cl ON ce.id = cl.id	 
						WHERE ce.id = ? '
mon problème maintenant est de définir l'id de "cl.id" car en réalité "cl.id" n'est pas = a "ce.id"
"cl.id" = "ce.id + A" ou +B, ou +C...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

11 oct. 2011, 18:38

Pas certain de mon coup, donne toujours un exemple dans un cas comme ça. Je vais présumer que ton identifiant ressemblerait donc à 1234A ou 1234C ? Dans ce cas, utilise la fonction SQL CONCAT, et ça deviendrait :
« cl.id = CONCAT(ce.id, 'A')
OR cl.id = CONCAT(ce.id, 'B')
OR cl.id = CONCAT(ce.id, 'C') »

Mais je ne suis pas certain que ça corresponde à tes données...?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

11 oct. 2011, 18:49

l'id du chien est en auto incrément donc 1,2,3,4 et ainsi de suite...
j'ai un script de vote ou je créer moi même l'id, et j'ai des questions A, B, C, D et ainsi de suite...
et l'id du vote devient id-chien + id de la question ex: 158-C
<?php echo calcul($donnees['id_chien'].'-A','10'); ?>
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

11 oct. 2011, 19:03

Mouais, ben je vais te suggérer une petite règle de base en SQL : ne JAMAIS utiliser une clé primaire comme donnée « signifiante ». Il faut considérer les clés primaire comme des données système et laisser ton SGBD les gérer. Si tu dois un jour modifier les identifiants de tes bestioles pour quelques raisons que ce soit, si ce sont des clés primaires, je te garantis une galère majuscule, le modèle pour Homme à grosse moustache et bras de camionneur velus :mrgreen:

Donc, pour un identifiant qui doit apparaitre dans la fiche d'un individu, base-toi sur la valeur de clé primaire si tu veux au moment de la création en concaténant avec la lettre appropriée selon tes critères, mais crée une colonne à part pour la stocker au complet. Même chose pour l'identifiant du vote : clé primaire que tu laisse gérer par ton SGBD, et une colonne avec la concaténation qui va bien. Ensuite, tu compares directement les valeurs des colonnes de données et non les clés primaires. Enfin ça, c'est si tu tiens à faire ces comparaisons là sans passer par la clé primaire, ce qui à mon avis n'est pas une bonne idée, mais je n'ai peut-être pas tous les éléments pour juger avec pertinence. :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

11 oct. 2011, 19:20

??? je ne suis pas sur de tout comprendre
je ne peux pas faire autrement que de chercher l'id du chien pour trouver les vote qui vont avec pour le moment
par contre je pense comprendre qu'il faut au lieu d'utiliser l'id du chien, prendre son N° de lof par exemple pour créer l'id du vote...

pour la table vote il ni a pas de clé primaire, l'id pourrait donc être "lof+D" ?

j'ajoute que pour l'instant il y a 7 questions (A B C D E F G) et que mon but est d'affiché les résultats des 7 questions pour les 14 chiens affiché sur la page...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

11 oct. 2011, 20:00

Alors je te suggère de toujours avoir des clés primaires dans tes tables, donc d'en rajouter une pour ta table des votes, et de n'effectuer de jointure exclusivement qu'en te basant sur les clés primaire, pour autant que ce soit possible et pertinent bien entendu, et le contraire est relativement rare.

Mais l'important est de distinguer les données « utiles » de ton applications des données « système » : les clés primaires sont, comme je disais plus tôt, à classer dans les données système : on ne les crée pas soi-même et on ne les modifie jamais, pas plus qu'on ne s'en sert pour autre chose que d'identifier une ligne dans le code, mais en aucun cas il ne faudrait les utiliser dans les informations de la fiche d'un de tes chiens par exemple. Sur la fiche, ce qui identifie l'animal, c'est ton lof, et c'est très bien comme ça. Tu as aussi un cas où pour trouver un parent, tu vas devoir utiliser le lof de l'un comme de l'autre pour établie le lien. C'est en principe aussi une donnée unique : il peut être tentant de s'en servir de clé primaire. Pour ma part, c'est un peu strict comme approche, mais je déconseille de le faire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

11 oct. 2011, 20:26

en fait je crois que je n'ai pas trop le choix:
imagine que je créer un nouveau chien, il existe bien dans la bdd mais pas encore dans la table vote...
maintenant je passe par le cote visiteur et j'affiche la page du chien que je viens d'inscrire, a ce moment j'ai des echo qui contiennent des variables ex:
<?php echo calcul($donnees['id_chien'].'-A','10'); ?>
et la lecture de cette variable déclenche par le biais d'un autre script l'ajout d'un nouveau champ dans la table calcul avec comme id: (id_chien + -A), le 10 sert a dire que la note va de 1 a 10 mais la on ne s'en occupe pas...

du coup, suis je vraiment obligé de créer un clé primaire ?
si oui, comment retrouver la question qui va avec le chien, rien ne va correspondre si par exemple j'ajoute plus tard une nouvelle question, non ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

11 oct. 2011, 20:42

Si un chien = un vote, au moment de créer le vote, tu récupères la clé primaire du chien. Il faut que dans ta table vote tu aies aussi une colonne en clé étrangère où tu enregistreras la valeur de clé primaire du chien correspondant. Et là, plus de soucis, tu retrouveras le vote correspondant au chien avec une jointure des plus ordinaires sur clé-primaire/clé-étrangère. À l'extrême rigueur, la clé primaire du vote pourrait être omise, mais pour ce que ça coute d'en mettre une, et compte tenu des possibilités à long terme qui n'ont pas encore été envisagées, ce serait de la simple prudence. Essaye de voir à long terme et à la pérennité de ton application. Avec le temps, elle risque d'évoluer, il te faut donc garder un maximum de souplesse dans le système. Les clés primaires sont un petit détail mais participent à cette souplesse.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

11 oct. 2011, 21:00

non, 1 chien = 1 vote par personne et sur 7 questions (A B C D E F G)... donc 7 vote par personne par chien...
mais je vais regarder pour créer dans la table vote un champ id-lof pour comparer "id_lof" et "id_chien" en clé étrangère mais je ne vois pas comment faire pour ne pas faire apparaître l'id de la question...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

12 oct. 2011, 09:05

Ok, donc on peut avoir plusieurs fois le même vote pour un même chien, la différence étant le votant. C'est ta troisième colonne qui complètera ta clé primaire composite : l'identifiant (clé primaire) du votant qui sera présent en clé étrangère dans ta table relationnelle.

J'ignore si tu utilises un outil particulier pour modéliser tes bases de données, mais en général ça aide parce que visuellement, c'est en général plus facile de comprendre l'organisation des données.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

12 oct. 2011, 10:55

je te fait voir la table car je ne connais pas l'id du cotant, je récupère son ip...
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mer 12 Octobre 2011 à 08:24
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `malivote`
--

-- --------------------------------------------------------

--
-- Structure de la table `calcul`
--

CREATE TABLE IF NOT EXISTS `calcul` (
  `id` varchar(255) NOT NULL,
  `total_votes` int(11) NOT NULL DEFAULT '0',
  `total_value` int(11) NOT NULL DEFAULT '0',
  `used_ips` longtext,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `calcul`
--

INSERT INTO `calcul` (`id`, `total_votes`, `total_value`, `used_ips`, `id_chien`) VALUES
('86-A', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),
('86-B', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),
('86-C', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),
('86-D', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),
('86-E', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),
('86-F', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),
('86-G', 1, 10, 'a:1:{i:0;s:9:"127.0.0.1";}', ''),

as tu un article pour me permette de comprendre modéliser une bdd ??? j'ai chercher mais je ne comprend pas...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.