Tables Liées?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tables Liées?

par Albat90 » 22 févr. 2007, 16:03

Bon bah j'ai fini par trouver une solution donc si ça peut servir à quelqu'un...

Voila mon code :
.....
//partie du select : ORDER BY très important pour mon script
//assez dommage car on ne peux pas classer comme on veux.
if ($nouveaux == "nouveaux") {
$sql1 = "SELECT adhesion_proprio.date, adhesion_proprio.idproprio, adhesion_proprio.paie, proprio.id, proprio.titre, proprio.nom, proprio.prenom, proprio.adresse, proprio.cp, proprio.ville, proprio.tel1  
From proprio, adhesion_proprio 
WHERE cp >= '90000' AND cp < '91000' AND proprio.id = adhesion_proprio.idproprio AND date <= '$date' $adhesion ORDER BY idproprio, date ASC"; 
}
.....
else {
while($data = mysql_fetch_array($query)){
if($data['date'] < $date){
$listenoire[] = $data['idproprio'];
list($key, $value) = each($listenoire); //voila pourquoi il faut que les ID soit dans l'orde ainsi que les dates...
}

elseif($data['idproprio'] == @$value);

else {
echo '<tr align="center" valign="middle"> 
    <td width="100" height="50">'.$data['idproprio'].'</td> 
    <td width="100" height="50">'.$data['nom'].'</td> 
    <td width="100" height="50">'.$data['prenom'].'</td> 
    <td width="100" height="50">'.$data['adresse'].'</td> 
    <td width="100" height="50">'.$data['cp'].'</td> 
    <td width="100" height="50">'.$data['ville'].'</td> 
    <td width="100" height="50">'.$data['tel1'].'</td> 
    <td width="100" height="50">'.$data['date'].'</td> 
</tr>';
$i++;
}
}
}
.....
Voila, c'est basic mais j'en ai chi***...
Si quelqu'un veux l'améliorer, il peut, ça m'arrangera :D

Merci pour ceux qui m'ont aidé ;)

par Albat90 » 22 févr. 2007, 12:43

bon j'ai trouver un début de mon procéder mais je suis bloqué.

Voila mon code :
while($data = mysql_fetch_array($query)){
if($data['date'] < $date)
$listenoire[] = $data['idproprio'];

else{
echo '<tr align="center" valign="middle"> 
    <td width="100" height="50">'.$data['titre'].'</td> 
    <td width="100" height="50">'.$data['nom'].'</td> 
    <td width="100" height="50">'.$data['prenom'].'</td> 
    <td width="100" height="50">'.$data['adresse'].'</td> 
    <td width="100" height="50">'.$data['cp'].'</td> 
    <td width="100" height="50">'.$data['ville'].'</td> 
    <td width="100" height="50">'.$data['tel1'].'</td> 
    <td width="100" height="50">'.$data['date'].'</td> 
</tr>';
$i++;
}
}
Bon avec ce code, j'ai une selection basic de date et j'ai un tableau associatif des personnes inscrites les années précedentes.

Bon maintenant, je voudrais mettre entre le "if" et le "else" que si $data['idproprio'] == "une donné qui est dans la $listenoire" , il passe à la donné suivante. Comme ça je peux filtrer les nouveaux arrivant de cette années ^^.

Merci de vos réponse ;)

par Albat90 » 22 févr. 2007, 10:35

Apparament c'est impossible :?

Merci quand même ;)

par Albat90 » 21 févr. 2007, 12:39

Ok, j'ai enlevé la boucle, j'ai trouvé une autre solution, l'utilisateur doit choisir une année, en plus c'est juste pour des statistique à l'année donc c'est bon ^^.

Par contre j'ai un autre problème.
Ma base est composé de deux table liée : proprio et adhesion_proprio.
Dans adhesion_proprio, j'ai un champ qui s'appel "date" et un champ "idproprio" relier à id de proprio ^^.
Donc dans adhésion j'ai ça par exemple :
id-----date-----idproprio
1-----2004-----56
2-----2005-----56
3-----2006-----56
8-----2005-----128
9-----2007-----128

Voila, et je voudrais selection par exemple seulement les nouveaux proprio en 2005 par exemple.
Donc là, il y aurais juste le proprio id 128 car le 56 était déja là en 2004.
Je n'arrive pas à imaginer une solution qui pourrais m'aiguiller vers le bon code.
En gros j'ai penser à :
Recherche dans la base les années 2005 => si rencontre un proprio déja là avant cette date, il passe jusqu'au proprio suivant...
M'enfin c'est assez dur à expliquer et je ne sais pas si c'est faisable.

Quelqu'un peux m'aider un peu???

Merci de vos réponse ;)

par Ryle » 20 févr. 2007, 11:37

Opte plutôt pour la jointure. Si jamais un jour ta première requête te ramène 1000 résultats, tu vas relancer aussi sec 1000 nouvelles requêtes vers la base juste pour trouver une date... c'est un peu dommage quand tu peux tout ramener dans une seule requête :)

par AB » 19 févr. 2007, 19:10

voila...
C'est pour ça que je demandais si une boucle dans une boucle, c'était bon ???
Merci de vos réponses ;)
...concernant les requêtes, c'est vraiment ce qu'il faut éviter...même si ça fonctionne.

par Albat90 » 19 févr. 2007, 18:18

Toujours pareil avec le distinct, bon j'ai trouver une solution, ma solution c'est ça
<?php
session_start();
$base = "localhost";
$user = "root";
$mdp = "";
$bdd = "bij";
$connect = mysql_connect($base, $user, $mdp) or die("impossible de se connecter");
mysql_select_db($bdd, $connect) or die("impossible de selectionner la BDD");
echo '<table border="1">
  <tr align="center" valign="middle">
    <td width="100" height="50"><b>identifiant</td>
    <td width="100" height="50"><b>Titre</td>
    <td width="100" height="50"><b>Nom</td>
    <td width="100" height="50"><b>Prenom</td>
    <td width="100" height="50"><b>Adresse</td>
    <td width="100" height="50"><b>Code Postale </td>
    <td width="100" height="50"><b>Ville</td>
    <td width="100" height="50"><b>T&eacute;l&eacute;phone</td>
	<td width="100" height="50"><b>Adhésion</td>
  </tr>';
$sql1 = "SELECT * From proprio WHERE cp >= '90000' AND cp < '91000' ORDER BY nom ASC";
$query = mysql_query($sql1) or die('Erreur SQL !'.$sql.''.mysql_error());
$i = 0;
while($data = mysql_fetch_array($query)){
$req = $data['id'];
$sql2 = "SELECT * From adhesion_proprio WHERE idproprio = '$req'";
$query2 = mysql_query($sql2) or die('Erreur SQL !'.$sql.''.mysql_error());
echo '<tr align="center" valign="middle">
    <td width="100" height="50">'.$data['id'].'</td>
    <td width="100" height="50">'.$data['titre'].'</td>
    <td width="100" height="50">'.$data['nom'].'</td>
    <td width="100" height="50">'.$data['prenom'].'</td>
    <td width="100" height="50">'.$data['adresse'].'</td>
    <td width="100" height="50">'.$data['cp'].'</td>
    <td width="100" height="50">'.$data['ville'].'</td>
    <td width="100" height="50">'.$data['tel1'].'</td>
	<td width="100" height="50">';
	while($data2 = mysql_fetch_array($query2)){
		echo	''.$data2['date'].'  ';
		}
echo  '</td>
</tr>';
$i++;
}
echo '</table>
il y a '.$i.' propriétaires dans le territoire de Belfort.';
?>
voila...
C'est pour ça que je demandais si une boucle dans une boucle, c'était bon ???

Merci de vos réponses ;)

par NiCreteNiSoumise » 19 févr. 2007, 17:55

$sql1 = "SELECT DISTINCT adhesion_proprio.date, proprio.id, proprio.titre, proprio.nom, proprio.prenom, proprio.adresse, proprio.cp, proprio.ville, proprio.tel1 
From proprio, adhesion_proprio
WHERE cp >= '90000' AND cp < '91000' AND proprio.id = adhesion_proprio.idproprio ORDER BY nom ASC"
Il faut donc rajouter DISTINCT dans la clause Select.

par Albat90 » 19 févr. 2007, 17:49

Merci pour ton aide Ryle, ça fonctionne très bien, voici mon script :
<?php
session_start();
$base = "localhost";
$user = "root";
$mdp = "";
$bdd = "bij";
$connect = mysql_connect($base, $user, $mdp) or die("impossible de se connecter");
mysql_select_db($bdd, $connect) or die("impossible de selectionner la BDD");
echo '<table border="1">
  <tr align="center" valign="middle">
    <td width="100" height="50"><b>identifiant</td>
    <td width="100" height="50"><b>Titre</td>
    <td width="100" height="50"><b>Nom</td>
    <td width="100" height="50"><b>Prenom</td>
    <td width="100" height="50"><b>Adresse</td>
    <td width="100" height="50"><b>Code Postale </td>
    <td width="100" height="50"><b>Ville</td>
    <td width="100" height="50"><b>T&eacute;l&eacute;phone</td>
	<td width="100" height="50"><b>Adhésion</td>
  </tr>';
$sql1 = "SELECT adhesion_proprio.date, proprio.id, proprio.titre, proprio.nom, proprio.prenom, proprio.adresse, proprio.cp, proprio.ville, proprio.tel1 
From proprio, adhesion_proprio
WHERE cp >= '90000' AND cp < '91000' AND proprio.id = adhesion_proprio.idproprio ORDER BY nom ASC";
$query = mysql_query($sql1) or die('Erreur SQL !'.$sql.''.mysql_error());
$i = 0;
while($data = mysql_fetch_array($query)){
echo '<tr align="center" valign="middle">
    <td width="100" height="50">'.$data['id'].'</td>
    <td width="100" height="50">'.$data['titre'].'</td>
    <td width="100" height="50">'.$data['nom'].'</td>
    <td width="100" height="50">'.$data['prenom'].'</td>
    <td width="100" height="50">'.$data['adresse'].'</td>
    <td width="100" height="50">'.$data['cp'].'</td>
    <td width="100" height="50">'.$data['ville'].'</td>
    <td width="100" height="50">'.$data['tel1'].'</td>
	<td width="100" height="50">'.$data['date'].'</td>
</tr>';
$i++;
}
echo '</table>
il y a '.$i.' propriétaires dans le territoire de Belfort.';
?>
Si j'ai donnée mon script ce n'est pas pour rien :p
c'est parceque je rencontre un autre problème, vue que j'ai plusieurs date d'adhesion (2005, 2006, 2007), donc il me répète à chaque fois le nom prenom etc... donc je me retrouve à chaque fois avec trois prenom identique etc au lieu d'une seule fois.

est-ce que c'est bon de faire un boucle dans une boucle en php/MySQL???

Merci de vos réponses ;)

par Ryle » 19 févr. 2007, 17:23

$sql1 = "SELECT * From proprio WHERE cp >= '90000' AND cp < '91000' ORDER BY nom ASC"; 
$sql2 = "SELECT * From adhesion_proprio WHERE idproprio = '$data['id']'";
Comment peut-il trouver la valeur de $data['id'] alors que $data n'est définie que 5 lignes plus bas ? :)

Il te faut soit inclure ta seconde requête dans la boucle pour qu'elle soit exécuté pour chaque $data['id'] de la première, soit effectuer une jointure entre tes deux tables pour ramener l'ensemble des infos en une seule requête :

Code : Tout sélectionner

SELECT t1.champ1, t1.champ2, ..., t2.champ1, t2.champ2, ... FROM table1 t1, table2 t2 WHERE t1.idTable1 = t2.idVersTable1 AND ....

Tables Liées?

par Albat90 » 19 févr. 2007, 17:09

Bonjour,

j'ai plusieur tables liées et j'ai du mal à afficher le resultat d'une table par rapport à une autre.

J'ai une table proprio avec un champ id et j'ai une autre table adhesion_proprio qui fait reference à ce champ avec le champ idproprio.

Voila mon script :
<?php
session_start();
$base = "localhost";
$user = "root";
$mdp = "";
$bdd = "bij";
$connect = mysql_connect($base, $user, $mdp) or die("impossible de se connecter");
mysql_select_db($bdd, $connect) or die("impossible de selectionner la BDD");
echo '<table border="1">
  <tr align="center" valign="middle">
    <td width="100" height="50"><b>Titre</td>
    <td width="100" height="50"><b>Nom</td>
    <td width="100" height="50"><b>Prenom</td>
    <td width="100" height="50"><b>Adresse</td>
    <td width="100" height="50"><b>Code Postale </td>
    <td width="100" height="50"><b>Ville</td>
    <td width="100" height="50"><b>T&eacute;l&eacute;phone</td>
	<td width="100" height="50"><b>Adhésion</td>
  </tr>';
$sql1 = "SELECT * From proprio WHERE cp >= '90000' AND cp < '91000' ORDER BY nom ASC";
$sql2 = "SELECT * From adhesion_proprio WHERE idproprio = '$data['id']'";
$query = mysql_query($sql1) or die('Erreur SQL !'.$sql.''.mysql_error());
$query2 = mysql_query($sql2) or die('Erreur SQL !'.$sql.''.mysql_error());
$i = 0;
while($data = mysql_fetch_array($query) AND $data2 = mysql_fetch_array($query2)){
echo '<tr align="center" valign="middle">
    <td width="100" height="50">'.$data['titre'].'</td>
    <td width="100" height="50">'.$data['nom'].'</td>
    <td width="100" height="50">'.$data['prenom'].'</td>
    <td width="100" height="50">'.$data['adresse'].'</td>
    <td width="100" height="50">'.$data['cp'].'</td>
    <td width="100" height="50">'.$data['ville'].'</td>
    <td width="100" height="50">'.$data['tel1'].'</td>
    <td width="100" height="50">'.$data2['date'].'</td>
  </tr>';
$i++;
}
echo '</table>
il y a '.$i.' propriétaires dans le territoire de Belfort.';
?>
Il me retourne une erreur a cause de ma requete à la ligne 21. mais je ne vois pas comment je peux régler le problème ?

Je veux afficher dans la case $data2['date'], la date qui correspond à sont adhesion mais pour cela, il faut qu'il la selection grace à l'id dans proprio...
Bref un gros bazare :(

Merci de vos réponse ;)