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, 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
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
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
Vieux 27/01/2010, 09h32   #2
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 10 069
Par défaut

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 :
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
Vieux 27/01/2010, 11h23   #3
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

J'ai fait cette requete et cela semble fonctionner (jointure externe)

Code :
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
Vieux 18/02/2010, 11h04   #4
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

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
Vieux 18/02/2010, 13h22   #5
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 10 069
Par défaut

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
Vieux 18/02/2010, 14h02   #6
Expert Confirmé
 
Avatar de Fench
 
Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
Par défaut

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
Vieux 18/02/2010, 15h16   #7
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

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.
Images attachées
Type de fichier : jpg 1.jpg (51,5 Ko, 24 affichages)
epoc.01 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/02/2010, 15h26   #8
Expert Confirmé
 
Avatar de Fench
 
Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
Par défaut

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
Vieux 18/02/2010, 15h57   #9
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

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
Vieux 18/02/2010, 16h26   #10
Expert Confirmé
 
Avatar de Fench
 
Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
Par défaut

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
Vieux 19/02/2010, 09h03   #11
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

Bonjour et merci pour votre aide.

Ma requete est la suivante :

Code :
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
Vieux 19/02/2010, 09h08   #12
Expert Confirmé
 
Avatar de Fench
 
Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
Par défaut

Gardes:
Code :
 
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 :
 
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
Vieux 19/02/2010, 09h21   #13
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

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
Vieux 19/02/2010, 09h42   #14
Expert Confirmé
 
Avatar de Fench
 
Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
Par défaut

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
Vieux 19/02/2010, 09h50   #15
Membre éprouvé
 
Avatar de RunCodePhp
 
Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 403
Par défaut

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.0 | Apache 2.2.11 | Php 5.3.0 | MySQL 5.1.36
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
Vieux 19/02/2010, 12h05   #16
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

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 :
$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
Vieux 19/02/2010, 12h32   #17
Membre éprouvé
 
Avatar de RunCodePhp
 
Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 403
Par défaut

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.0 | Apache 2.2.11 | Php 5.3.0 | MySQL 5.1.36
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
Vieux 19/02/2010, 12h43   #18
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

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
Vieux 19/02/2010, 12h50   #19
Membre éprouvé
 
Avatar de RunCodePhp
 
Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 403
Par défaut

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.0 | Apache 2.2.11 | Php 5.3.0 | MySQL 5.1.36
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
Vieux 19/02/2010, 13h04   #20
Membre régulier
 
Date d'inscription: octobre 2008
Messages: 123
Par défaut

merci a tous, au final j'ai cette requete :

Code :
$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
NEWS PHPFAQ PHPCours PHPSources PHPLivres PHPScripts PHPOutils PHPComparatifsZend Framework

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 02h36.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.