IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Jointure SQL


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut Jointure SQL
    Bonjour, j'ai une requete sql que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "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

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    J'ai fait cette requete et cela semble fonctionner (jointure externe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1
    Resultat 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='1' LIMIT 1
    Resultat 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='' LIMIT 1
    Resultat 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    J'ai toujours le meme probleme.
    En enlevant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1
    Merci pour votre aide

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je n'ai pas du tout compris ce que tu fais ni ce que tu veux obtenir.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    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

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    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.

  8. #8
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    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

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    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 ?

  10. #10
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    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 )

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    Bonjour et merci pour votre aide.

    Ma requete est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  12. #12
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Gardes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM annonce a
    LEFT OUTER JOIN reserv r
    ON a.idannonce = r.idannonce 
    WHERE a.piscine='1'

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    Il y a effectivement 11 resultats

    9 pour idannonce = 1
    requete photo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='1' LIMIT 1
    1 pour idannonce = 18
    requete photo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='18' LIMIT 1
    1 pour idannonce = 19
    requete photo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='' LIMIT 1
    et ca fonctionne toujours pas. Je seche

  14. #14
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    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 ?

  15. #15
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    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.

    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.

  16. #16
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM photo WHERE idannonce='".$val['idannonce']."' LIMIT 1
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  17. #17
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    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.

  18. #18
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    avec un right outer join, cela exclu les id qui ne sont pas dans reserv. Cela pourrait etre une solution

  19. #19
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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)

  20. #20
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    merci a tous, au final j'ai cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SQL] problème de variable tableau PHP contenant les données d'une jointure SQL
    Par Schpountz42 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/02/2007, 05h59
  2. [MS Query] neophyte demande aide sur jointures SQL
    Par thorgal972 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 27/11/2006, 17h13
  3. [SQL] PB : Jointure SQL ne fonctionne pas..
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/09/2006, 14h03
  4. Réponses: 1
    Dernier message: 28/07/2006, 03h57
  5. Réponses: 4
    Dernier message: 11/10/2005, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo