|
Publicité | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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 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"; Pouvez vouz m'aider ? merci |
|
|
|
|
|
#2 |
![]() Date d'inscription: juillet 2005
Messages: 10 069
|
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. |
|
|
|
|
|
#3 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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 Merci Sabotage Par contre pas moyen de recuperer le chamsp idannonce Code :
SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1 Code :
SELECT * FROM photo WHERE idannonce='1' LIMIT 1 Code :
SELECT * FROM photo WHERE idannonce='' LIMIT 1 Code :
SELECT * FROM photo WHERE idannonce='' LIMIT 1 |
|
|
|
|
|
#4 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
J'ai toujours le meme probleme.
En enlevant : Code :
LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce Je ne sais pas comment transformer cette requete afin d'avoir le resultat souhaité Code :
SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1 |
|
|
|
|
|
#5 |
![]() Date d'inscription: juillet 2005
Messages: 10 069
|
Je n'ai pas du tout compris ce que tu fais ni ce que tu veux obtenir.
|
|
|
|
|
|
#6 |
|
Expert Confirmé
![]() Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
|
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
__________________
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) |
|
|
|
|
|
#7 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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. |
|
|
|
|
|
#8 |
|
Expert Confirmé
![]() Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
|
Oui, bien enléves ton GROUP BY, il sert à rien !!!
GROUP est tjs associé à une fonction crée ou connue comme COUNT, MAX etc
__________________
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) |
|
|
|
|
|
#9 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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 ? |
|
|
|
|
|
#10 |
|
Expert Confirmé
![]() Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
|
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
__________________
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) |
|
|
|
|
|
#11 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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 |
|
|
|
|
|
#12 |
|
Expert Confirmé
![]() Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
|
Gardes:
Code :
SELECT * FROM annonce LEFT OUTER JOIN reserv ON annonce.idannonce = reserv.idannonce WHERE typeoffre='location' AND piscine='1' AND activ='1' 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'
__________________
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) |
|
|
|
|
|
#13 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
Il y a effectivement 11 resultats
9 pour idannonce = 1 requete photo : Code :
SELECT * FROM photo WHERE idannonce='1' LIMIT 1 requete photo : Code :
SELECT * FROM photo WHERE idannonce='18' LIMIT 1 requete photo : Code :
SELECT * FROM photo WHERE idannonce='' LIMIT 1 |
|
|
|
|
|
#14 |
|
Expert Confirmé
![]() Date d'inscription: mai 2002
Localisation: Auvergne
Messages: 1 567
|
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 ?
__________________
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) |
|
|
|
|
|
#15 | ||
|
Membre éprouvé
![]() Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 403
|
Salut
Citation:
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:
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] |
||
|
|
|
|
|
#16 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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 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 |
|
|
|
|
|
#17 |
|
Membre éprouvé
![]() Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 403
|
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] |
|
|
|
|
|
#18 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
avec un right outer join, cela exclu les id qui ne sont pas dans reserv. Cela pourrait etre une solution
|
|
|
|
|
|
#19 | |
|
Membre éprouvé
![]() Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 403
|
Citation:
__________________
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] |
|
|
|
|
|
|
#20 |
|
Membre régulier
![]() Date d'inscription: octobre 2008
Messages: 123
|
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 "; Merci a tous. |
|
|
|
|
|
![]() |
||
Jointure SQL
|
||
| Outils de la discussion | |
|
|