Requête select sur 2 tables innodb [Résolu/Fermé]

Messages postés
155
Date d'inscription
dimanche 28 septembre 2008
Statut
Membre
Dernière intervention
28 mars 2010
- - Dernière réponse :  Utilisateur anonyme - 28 nov. 2008 à 14:17
Bonjour,


Je suis débutant, et je cherche à faire une requête SELECT sur 2 tables. Je voudrais récupérer les "signalement" de la table anomalie qui correspondent à son "idchariot dans la table chariot. En clair, si je clique sur un chariot, cela affiche les signalements de celui-ci. Je m'explique :

j'ai une base Mysql qui comprend 2 tables (InnoDB).
Voici les 2 tables :

CREATE TABLE `chariot` (

`idchariot` int( 11 ) NOT NULL AUTO_INCREMENT ,
`type` varchar( 255 ) NOT NULL ,
`energie` varchar( 255 ) NOT NULL ,
`marque` varchar( 255 ) NOT NULL ,
`modele` varchar( 255 ) NOT NULL ,
`n_serie` varchar( 30 ) NOT NULL ,
`annee` int( 11 ) NOT NULL ,
`n_parc` varchar( 255 ) NOT NULL ,
PRIMARY KEY ( `idchariot` )
) ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT =


CREATE TABLE `anomalie` (
`idano` int(11) NOT NULL auto_increment,
`idchariot` int(10) NOT NULL,
`signalement` varchar(255) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`idano`),
KEY `idchariot` (`idchariot`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=


J'ai ajouté un champ "idchariot" sur chacune des tables. "idchariot" sur la table anomalie est indexé. Je n'ai pas de clé étrangère car je ne sais pas m'en servir.

Voici l'état de ma requête, elle fonctionne mais affiche toujours le même enregistrement (signalement) :

"SELECT anomalie.signalement FROM anomalie INNER JOIN chariot ON anomalie.idchariot = chariot.idchariot";

Voici la requête d'insertion de la table anomalie :

$date = $_POST['date'];
$signalement = $_POST['signalement'];
$idchariot = $_POST['idchariot'];

$req = mysql_query("INSERT INTO anomalie (idchariot, signalement, date) VALUES ('$idchariot', '$signalement', '$date')");

J'ai compris le principe des jointures avec les différentes syntaxes, j'ai tenté beaucoup de combinaisons de jointures mais après une semaines d'essais je sèche lamentablement.

Merci de votre aide.
Afficher la suite 

6 réponses

Meilleure réponse
1
Merci
oui vas-y dis moi

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 62915 internautes nous ont dit merci ce mois-ci

0
Merci
ta base de donnée est mal construite
en fait il faut utiliser un alter table pour créer un lien entre deux tables.
de plus tu utilise des mots SQL interdit pour tes noms de champs par exemple "date"


réessaye avec ça

CREATE TABLE CHARIOT( 
id_CHARIOT INT NOT NULL AUTO_INCREMENT,
leType_CHARIOT VARCHAR(255),
energie_CHARIOT VARCHAR(255) ,
marque_CHARIOT VARCHAR(255),
modele_CHARIOT VARCHAR(255),
numSerie_CHARIOT VARCHAR(30),
annee_CHARIOT INT,
numParc_CHARIOT VARCHAR(255),
CONSTRAINT PK_Chariot PRIMARY KEY(id_CHARIOT)
);

CREATE TABLE ANOMALIE(
id_ANOMALIE INT(11) NOT NULL AUTO_INCREMENT,
idChariot_ANOMALIE INT NOT NULL,
signalement_ANOMALIE VARCHAR(255),
date_ANOMALIE DATE,
CONSTRAINT PK_ANOMALIE PRIMARY KEY(id_ANOMALIE)
);

ALTER TABLE ANOMALIE
ADD CONSTRAINT FK_ANOMALIE_CHARIOT FOREIGN KEY(idChariot_ANOMALIE)
REFERENCES CHARIOT(id_CHARIOT)
;


Pour ta requête il faut faire
SELECT A.signalement_ANOMALIE 
FROM ANOMALIE A,CHARIOT C
WHERE C.id_CHARIOT=A.idChariot_ANOMALIE
AND C.numSerie_CHARIOT = leNumDeSerieDuChariot


Dis moi si ça marche comme ça

P.S. : n'utilise pas le NOT NULL partout sinon après tu es obligé de remplir tous les champs


Messages postés
155
Date d'inscription
dimanche 28 septembre 2008
Statut
Membre
Dernière intervention
28 mars 2010
13
0
Merci
Merci, ça fonctionne si je récupère le numserie.

SELECT A.signalement_ANOMALIE
FROM ANOMALIE A,CHARIOT C
WHERE C.id_CHARIOT=A.idChariot_ANOMALIE
AND C.numSerie_CHARIOT = leNumDeSerieDuChariot

Entre temps j'y suis aussi arrivé avec cette requête, la tienne semble plus normalisée :

'SELECT anomalie.signalement FROM anomalie INNER JOIN chariot ON anomalie.idchariot = '.$idchariot.'';

A priori le fait de se servir de clé étrangères faciliterai l'intégrité de la base.
Utilisateur anonyme -
pense à cocher résolu !!

P.S. : c'est plus normalisé car je sort tout droit de l'école :P
Messages postés
155
Date d'inscription
dimanche 28 septembre 2008
Statut
Membre
Dernière intervention
28 mars 2010
13
0
Merci
Ok, merci :) bonne soirée.
Messages postés
155
Date d'inscription
dimanche 28 septembre 2008
Statut
Membre
Dernière intervention
28 mars 2010
13
0
Merci
Bonjour Dante,

Est-ce que je peux encore abuser de tes connaissances pour finaliser mon code ?
Messages postés
155
Date d'inscription
dimanche 28 septembre 2008
Statut
Membre
Dernière intervention
28 mars 2010
13
0
Merci
Ce code m'affiche les enregistrements en boucle mais ne s'arrête après le dernier trouver correspondant à son idchariot. du coup même s'il n'y a qu'un seul enregistrement et que je met LIMIT 2, il m'affiche le même enregistrement 2 fois.

<?php
$requete3 = 'SELECT anomalie.signalement, anomalie.idano, anomalie.idchariot FROM anomalie INNER JOIN chariot ON anomalie.idchariot = '.$idchariot.' LIMIT 2';

$execution_requete3 = mysql_query($requete3);
$total3 = mysql_num_rows($execution_requete3);


if($total3) {

echo '<table border="0" cellspacing="0" cellpadding="8" bgcolor="#FFFFFF" >'."\n";

echo '<tr>';
echo '<td><b><u>Anomalies en cours</u></b></td>';
echo '</tr>'."\n";

while($row = mysql_fetch_array($execution_requete3)) {
echo '<tr>';
echo '<td>'.$row['signalement'].'</td>';
echo '</tr>'."\n";
}
echo '</table>'."\n";

}
else echo 'Pas d\'enregistrements dans la base...';


mysql_free_result($execution_requete3);
?>
Utilisateur anonyme -
le problème c'est que je n'ai jamais utilisé INNER JOIN (ni LIMIT d'ailleurs)

est-il possible que tu utilises ce que je t'ai donné je pourrais ensuite t'aider

Si tu utilise ce que je t'ai donné, c'est une requête simple.