Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 27/01/2010, 06h33   #1
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
Par défaut Jointure SQL

Bonjour, j'ai une requete sql que voici :

Code :
SELECT * FROM annonce, reserv WHERE (typeoffre='location' AND piscine='1') AND annonce.idannonce = reserv.idannonce AND activ='1' GROUP by annonce.idannonce LIMIT 0, 4
Elle doit me renvoyer 3 résultats, or elle ne m'en renvoit qu'un seul.
Quand j'enleve le annonce.idannonce = reserv.idannonce alors cela m'affiche les 3 resultats. Comment corriger cela ?

Autre chose dans mes deux tables (reserv, annonce), j'ai le meme champs idannonce.

Avec cette requete :

Code :
"SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1";
Comment differencier de quelle table provient l'information ? J'ai essayé en mettant idannonce='".$val['annonce.idannonce']." et annonce.idannonce='".$val['idannonce']."' (resultat : Unknown column 'annonce.idannonce' in 'where clause').

Pouvez vouz m'aider ? merci
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2010, 09h32   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
La raison semble evident : tu n'as qu'une ligne ayant la meme valeur idannonce dans tes deux tables.

Par ailleurs, une jointure s'écrit avec JOIN.
Code sql :
1
2
3
4
5
SELECT * FROM annonce 
JOIN reserv ON annonce.idannonce = reserv.idannonce 
WHERE typeoffre='location' AND piscine=1 AND activ=1
GROUP BY annonce.idannonce 
LIMIT 0, 4

Si tu veux recuperer deux champs ayant le meme nom, il faut utiliser un alias.
Par contre dans ton cas, ca ne sert a rien puisque les deux champs idannonce ont la meme valeur.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2010, 11h23   #3
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
J'ai fait cette requete et cela semble fonctionner (jointure externe)

Code :
1
2
3
4
SELECT * FROM annonce
LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce 
WHERE typeoffre='location' AND piscine='1' AND activ='1' 
GROUP by annonce.idannonce LIMIT 0, 4
J'ai bien trois resultats.

Merci Sabotage

Par contre pas moyen de recuperer le chamsp idannonce

Code :
SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1
Resultat 1 :
Code :
SELECT * FROM photo WHERE idannonce='1' LIMIT 1
Resultat 2 :
Code :
SELECT * FROM photo WHERE idannonce='' LIMIT 1
Resultat 3 :
Code :
SELECT * FROM photo WHERE idannonce='' LIMIT 1
Je ne comprends pas. Pourant j'ai bien la suite des champs qui s'aafiche correctement pour chaque idannonce
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 11h04   #4
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
J'ai toujours le meme probleme.
En enlevant :

Code :
LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce
cela fonctionne. Le probleme provient il de la jointure ou du fait que les deux champs est le meme nom ?

Je ne sais pas comment transformer cette requete afin d'avoir le resultat souhaité
Code :
SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1
Merci pour votre aide
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 13h22   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Je n'ai pas du tout compris ce que tu fais ni ce que tu veux obtenir.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 14h02   #6
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Bonjour,

Tu peux nous montrer la table annonce (plusqu'elle ne contient pas grand chose) car j'ai un énorme doute sur le GROUP bY

J'aimerais les trois enregistrements de la table reserve qui doivent sortir avec le idannonce
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 15h16   #7
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
Table annonce
idannonce piscine
1 1
18 1
19 1

Table reserv where idannonce='1'


Table reserv where idannonce='18'
pas de reservation entrée

Table reserv where idannonce='19'
pas de reservation entrée

Ca viendrait de cela ? Du fait que je n'ai pas de données ....
COmment eviter cela ? Car les données ne sont pas forcement entrées.

Dernière modification par epoc.01 ; 08/12/2010 à 09h17.
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 15h26   #8
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Oui, bien enléves ton GROUP BY, il sert à rien !!!

GROUP est tjs associé à une fonction crée ou connue comme COUNT, MAX etc
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 15h57   #9
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
non en enlevant le group by, c'est la meme chose.

Je comprends maintenant que le probleme vient que les données n'etaint pas entrées pour les deux dernieres ID. Mais comment regler ce probleme, j'ai besoin de cette jointure et les données ne seront pas toujours saisies par l'utilisateur. Que faire ?
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2010, 16h26   #10
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Oui, je voulais pas dire que le GROUP BY ne servait à rien mais ne résoudrait l'erreur

Pour ton erreur (qui ne l'est pas car c un manque d'information), il ne faut pas que tu fasses une jointure JOIN ou INNER JOIN mais LEFT OUTER JOIN avec annonce à gauche

Edit: qui te donnera 11 lignes, si tu veux que les id différents (3 lignes) faudra ajouter un DISTINCT idanonce mais ya plus d'intérêt (vaut mieux un select simple dans ce cas )
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 09h03   #11
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
Bonjour et merci pour votre aide.

Ma requete est la suivante :

Code :
1
2
3
4
SELECT * FROM annonce 
LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce 
WHERE typeoffre='location' AND piscine='1' AND activ='1' 
GROUP by annonce.idannonce LIMIT 0, 4

Que dois je changer ? Je n'ai pas trop compris
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 09h08   #12
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Gardes:
Code :
1
2
3
4
 
SELECT * FROM annonce 
LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce 
WHERE typeoffre='location' AND piscine='1' AND activ='1'
pour l'instant l'affichage avec LIMIT, tu ajouteras celà après ...

Sinon les champs 'typeOffre' et 'activ', je sais d'ou ils viennent et piscine tjs = à 1 pour l'instant !!

En conclusion essayes: (retrourne 11 lignes)
Code :
1
2
3
4
5
 
SELECT * FROM annonce a
LEFT OUTER JOIN reserv r
ON a.idannonce = r.idannonce 
WHERE a.piscine='1'
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 09h21   #13
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
Il y a effectivement 11 resultats

9 pour idannonce = 1
requete photo :

Code :
SELECT * FROM photo WHERE idannonce='1' LIMIT 1
1 pour idannonce = 18
requete photo :

Code :
SELECT * FROM photo WHERE idannonce='18' LIMIT 1
1 pour idannonce = 19
requete photo :

Code :
SELECT * FROM photo WHERE idannonce='' LIMIT 1
et ca fonctionne toujours pas. Je seche
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 09h42   #14
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Qu'est qui fonctionne toujours pas ?

La boucle des $val['idannonce'] pour toutes les autres requête photos ?

Manque pour le '19' ?

En enlevant le code superflu, tu peux nous donner la dernière version de la requête initiale et de la boucle ?
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 09h50   #15
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 229
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 229
Points : 2 581
Points : 2 581
Salut

Citation:
Ca viendrait de cela ? Du fait que je n'ai pas de données ....
COmment eviter cela ? Car les données ne sont pas forcement entrées.
Si tu fais une jointure entre 2 tables sur un ID en total relation et que d'un coté il y a des enregistrements et de l'autre non, alors c'est que la Bdd est corrompue.

Soit il manque des données dans l'une des 2 tables, soit il y en de trop.
Au vu de ce que tu dis, il en manque.

Une jointure c'est imparable (à condition bien sur quelle soit exactement la bonne), et si des enregistrement sont ignorés alors que cela ne devrait pas, alors il y a un problème dans la Bdd.
A mon avis il n'y a pas d'autres moyen que de corriger ça, quitte à le faire manuellement.

Ca sous entend qu'il doit avoir un problème lors de l'insertion des données, elles se feraient dans 1 table, mais pas dans l'autre en relation, ce qui semble le plus probable.
Vérifier cette étape devient nécessaire, et réparer le code si c'est le cas.
Faudra aussi faire attention s'il n'y aurait pas d'autre tables liées (idannonce), et vérifier la cohérence des données.

Citation:
Table annonce
1 1
18 1
19 1
Normalement il faudrait qu'il y ait au moins 1 ligne dans la table "reserv" avec comme idannonce 18 et 19.


Au vu du phénomène que tu rencontre, c'est ce que je remarque.
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 12h05   #16
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
L'ajout d'annonce se fait etape par etape, 6 au total. Les 4 premieres font appels a la table annonce, ensuite photo et enfin reserv. La personne inserant les annonces peut s'arreter quand il le souhaite, d'ou le manque d'info dans la table reserv. Mais c'est chose voulue et non un probleme d'insertion.

Concernant la requete, je comprends maintenant, j'ai mis du temps, que c'est du au manque d'info dans reserv. Mais il doit bien exister un moyen pour afficher le bon id meme si je n'ai pas de données dans reserv.

Dans cette requete, il doit bien exister un moyen de lui spécifier que quelle table on parle :

Code :
SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1
Voici le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$result = mysql_query(SELECT * FROM annonce 
LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce 
WHERE typeoffre='location' AND piscine='1' AND activ='1' 
GROUP by annonce.idannonce LIMIT 0, 4) or die(mysql_error());
//debut affichage tableau
			$j = 1;
			echo '<table border="0" ><tr><td>';
			while ($val = mysql_fetch_array($result)) {
						if($j == 2 or $j == 4) { 
							echo '</td><td>'; 
						}
					$photo = "SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1";
					echo $photo;
					$rphoto = mysql_query($photo) or die(mysql_error());
					$nbphoto = mysql_num_rows($rphoto);
					$rowphoto = mysql_fetch_assoc($rphoto);
//... pour afficher les autre champs
Ce que je ne comprends pas, c'est qu'il ne reconnaisse pas le idannonce mais affiche le reste des données correspondant a l'annonce correctement.
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 12h32   #17
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 229
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 229
Points : 2 581
Points : 2 581
Si tu confirme qu'il est normal de ne pas avoir de ligne dans la table "reserv" (pour le 18 et 19 par exemple), et bien il ne faut pas faire de jointure sur cette table, tout simplement.
Pas de -> annonce.idannonce = reserv.idannonce, ceci exclus les lignes.

Je vois que tu veux récupérer des photos dans une table photo, et apparement l'ID 19 cause problème.
Mais est ce qu'il y a une ligne idannonce 19 dans cette table "photo" ?


Comme ça un peu au pif : Pourquoi ne pas faire une jointure entre "annonce" et "photo" uniquement ?


A coté de ça, il me semble qu'un "... annonce LEFT JOIN reserv" devrait retourner toutes les lignes de "annonce" même si "reserv" n'en contient pas.
Les données de "reserv" seront dans ce cas là vides.
Ou alors un RIGHT JOIN, je ne sais plus.
Ou encore FULL JOIN

Attention aussi à ces 2 clauses : AND piscine='1' AND activ='1'
Ceci peut être la cause de l'exclusion des lignes de la table "reserv".


En tout cas il faut au moins voir ce qu'il y a ou ce qu'il n'y a pas dans ces tables là pour mieux comprendre ce que fait MySQL, sinon on tourne en rond.
Et savoir aussi exactement ce que tu veux obtenir.
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 12h43   #18
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
avec un right outer join, cela exclu les id qui ne sont pas dans reserv. Cela pourrait etre une solution
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 12h50   #19
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 229
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 229
Points : 2 581
Points : 2 581
Citation:
avec un right outer join, cela exclu les id qui ne sont pas dans reserv. Cela pourrait etre une solution
Si le but est d'exclure les lignes, alors fait un simple JOIN ou INNER JOIN (pas de left, right et encore moins full)
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2010, 13h04   #20
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 170
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 170
Points : 25
Points : 25
merci a tous, au final j'ai cette requete :

Code :
1
2
3
$req = "SELECT * FROM annonce ";
	if($_POST['prixmax'] or $_POST['prixmin']) $req.="INNER JOIN reserv ON annonce.idannonce = reserv.idannonce ";
	$req.= "WHERE ";
Et ca fonctionne, c'est un peu bricolage mais c'est ok.

Merci a tous.
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 23h58.


 
 
 
 
Partenaires

Hébergement Web