[ php ] jointures problemes

jointures problemes [ php ] - Programmation

Marsh Posté le 03-09-2002 à 17:11:10    

saut,
c'est pour un moteur de recherche, je voudrai mettre des jointures car j'ai besoin de plusieurs tables...
 
Voila ce que j'ai mis pour le debut de la requete :
 

Code :
  1. $query = 'SELECT t1.id,t1.nom,t1.infos,t2.titre,t2.id_artistes,t2.id_lyrics FROM ';
  2. $query .= artistes As t1 LEFT join chansons As t2 On t1.id=t2.id_artistes.' WHERE ';


 
cette meme requete fonctionne pourtant correctement avec un autre script mais là ca passe pas :/ bizzare.....
 


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 17:11:10   

Reply

Marsh Posté le 03-09-2002 à 17:15:29    

C'est quoi le WHERE qui est a la fin ??

Reply

Marsh Posté le 03-09-2002 à 17:20:56    

bozocarzu a écrit a écrit :

C'est quoi le WHERE qui est a la fin ??




 
bein c normal c construi comme ça ya la suite apres ça marche quand ya pas de jointures donc c pas ca ;)
 
voila le code en fait :
 

Code :
  1. $query = 'SELECT t1.id,t1.nom,t1.infos,t2.titre,t2.id_artistes,t2.id_lyrics FROM ';
  2. $query .= artistes As t1 LEFT join chansons As t2 On t1.id=t2.id_artistes.' WHERE ';
  3. if($cat!="all" )
  4. {
  5. $query .= 'id = "' . $cat . '" AND ';
  6. }
  7. $query .= 'nom LIKE "%' . $search . '%" ';
  8. $query .= 'OR infos LIKE "%' . $search . '%" ';
  9. $query .= 'OR titre LIKE "%' . $search . '%" ';
  10. $query .= 'ORDER BY "' . $tri . '" ';
  11. $query .= $sens . ' ';
  12. $query .= 'LIMIT ';
  13. $query .= $debut . ',';
  14. $query .= $nb;


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 17:30:49    

C'est quoi cette requete de fou ?

Reply

Marsh Posté le 03-09-2002 à 17:36:13    

tu pourrais faire un echo htmlentites($query) avant de balancer la requête pour voir sa tronche ? (peut être uin pb d'espace ou de virgule selon les argumetns passés)
 
ensuite tu la colle dans phpmyadmin pour voir un peu quel est le problème
 
bozocarzu >> bin c'est qu'une requête SQL tout ce qu'il y de plus normale :D en ce moment j'tape les même mais avec jointures sur tables, ça tourne super bien.


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 17:38:32    

Oui, se que je veut dire par fou, c'est la façon dont elle est construite !

Reply

Marsh Posté le 03-09-2002 à 17:41:05    

bin pour un moteur de recherche t'as pas trop le choix, faut la modifier selon le formulaire de recherche et c'est pas toujours très drôle


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 17:42:33    

pour mon moteur de recherche d'article dans une boutique en ligne :
 

Code :
  1. $Req = "SELECT DISTINCTROW
  2.   $Articles_Tbl.Id, $Articles_Tbl.Prix, $Articles_Tbl.Cat1, $Articles_Tbl.Cat2, $Articles_Tbl.Code_Interne,
  3.   $Articles_Tbl.Dispo, $Articles_Tbl.Promo, $Articles_Tbl.Poids, $Articles_Tbl.Tva, $Desc_articles_Tbl.Nom_$Lang,
  4.   $Desc_articles_Tbl.Desc_$Lang, $Fournisseur_Tbl.Nom as Fournisseur, $Categories_Tbl.Lvl
  5.   FROM $Articles_Tbl
  6.   LEFT JOIN $Desc_articles_Tbl ON $Articles_Tbl.Id = $Desc_articles_Tbl.Idx
  7.   LEFT JOIN $Fournisseur_Tbl ON $Fournisseur_Tbl.Id = $Articles_Tbl.Fournisseur
  8.   LEFT JOIN $Categories_Tbl ON $Categories_Tbl.Id=$Articles_Tbl.Cat1
  9.   WHERE $Articles_Tbl.Visible=1 ";
  10.   // MODIFICATION DE LA REQUETE EN FONCTION DES PARAMETRES DE LA PAGE DE RECHERCHE AVANCEE
  11.   if ($HTTP_POST_VARS["search"]=="Lancer la recherche" ) {
  12.     if ($HTTP_POST_VARS["Cat"]!=0) $Req .= "AND $Articles_Tbl.Cat1=".$HTTP_POST_VARS["Cat"]." OR $Articles_Tbl.Cat2=".$HTTP_POST_VARS["Cat"];
  13.     if (isset($HTTP_POST_VARS["Ref"]) && $HTTP_POST_VARS["Ref"]!='') $Req .= "AND $Articles_Tbl.Code_interne LIKE '%".$HTTP_POST_VARS["Ref"]."%' ";
  14.     if ($HTTP_POST_VARS["Fournisseur"]!=0) $Req .= " AND $Articles_Tbl.Fournisseur=".$HTTP_POST_VARS["Fournisseur"];
  15.     if ($HTTP_POST_VARS["Dispo"]>=0) $Req .= " AND $Articles_Tbl.Dispo >=".$HTTP_POST_VARS["Dispo"];
  16.     if(isset($HTTP_POST_VARS["Prix_Min"]) && $HTTP_POST_VARS["Prix_Min"]!='') $Prix_min = str_replace(",",".",$HTTP_POST_VARS["Prix_Min"]);
  17.     if(isset($HTTP_POST_VARS["Prix_Max"]) && $HTTP_POST_VARS["Prix_Max"]!='') $Prix_max = str_replace(",",".",$HTTP_POST_VARS["Prix_Max"]);
  18.     if ($HTTP_POST_VARS["tva"]==1) {
  19.       $Prix_min = number_format((100*$Prix_min)/($Tva[0]+100),2);
  20.       $Prix_max = number_format((100*$Prix_max)/($Tva[0]+100),2);
  21.     }
  22.     if ($HTTP_POST_VARS["Prix_Min"]!='' && $HTTP_POST_VARS["Prix_Max"]!='') $Req .= " AND $Articles_Tbl.Prix BETWEEN $Prix_min AND $Prix_max ";
  23.     elseif ($HTTP_POST_VARS["Prix_Min"]!='' && $HTTP_POST_VARS["Prix_Max"]=='') $Req .= " AND $Articles_Tbl.Prix >= $Prix_min ";
  24.     elseif ($HTTP_POST_VARS["Prix_Min"]=='' && $HTTP_POST_VARS["Prix_Max"]!='') $Req .= " AND $Articles_Tbl.Prix <= $Prix_max";
  25.     if ($HTTP_POST_VARS["Promo"]==1) $Req.= " AND $Artcles_Tbl.Promo!=0";
  26.     if ($HTTP_POSt_VARS["Focus"]==1) $Req .= " AND $Articles_Tbl.Focus!=0";
  27.     $Keywords = $HTTP_POST_VARS["Keywords"];
  28.     if ($Keywords!='') {
  29.       $Keywords = explode(" ",$Keywords);
  30.       $Req .= "AND ( $Desc_articles_Tbl.Desc_$Lang LIKE '%".$Keywords[0]."%' OR $Desc_articles_Tbl.Nom_$Lang LIKE '%".$Keywords[0]."%' OR $Desc_articles_Tbl.Spectech_$Lang LIKE '%".$Keywords[0]."%'";
  31.       for ($i = 1 ; $i<count($Keywords) ; $i++) {
  32.         $Req .= " OR $Desc_articles_Tbl.Desc_$Lang LIKE '%".$Keywords[0]."%' OR $Desc_articles_Tbl.Nom_$Lang LIKE '%".$Keywords[0]."%' OR $Desc_articles_Tbl.Spectech_$Lang LIKE '%".$Keywords[0]."%'";
  33.       }
  34.       $Req .= " )";
  35.     }
  36.   }


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 17:49:49    

Si sa marche !!!

Reply

Marsh Posté le 03-09-2002 à 17:52:20    

bozocarzu a écrit a écrit :

Si sa marche !!!




 
 :??:  :??:


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 17:52:20   

Reply

Marsh Posté le 03-09-2002 à 17:56:49    

Du moment que ta requete fonctionne, temps meiux, mais si il y as une erreur dans ton code, bonne chance pour la trouver !!

Reply

Marsh Posté le 03-09-2002 à 18:01:36    

bah.. je fait que traiter les champs du moteur de recherche un par un, une fois la requête générée, tu la teste et tu vois très vite d'ou peux venir l'erreur (en fonction du msg MySQL).
 
 
pour le problème original, je pencherais pour un WHERE en trop), sans conditions si jamais rien n'est coché dans le formulaire, mais il faurdrait vrament voir la requête entière après traitement du formulaire.


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 18:17:31    

Il il devrais faire un echo"$query" pour voir a quoi elle ressemble !

Reply

Marsh Posté le 03-09-2002 à 18:29:35    

Question con, c'est quoi la base de donnée utiliser?
Si c'est mysql, t'as pas besoin de chercher lus loin, mysql ne sait pas utiliser des jointure de type "LEFT join" (et autres jointures dites non parfaites).

Reply

Marsh Posté le 03-09-2002 à 18:31:25    

Oui c'est mysql qu'utilise ludo

Reply

Marsh Posté le 03-09-2002 à 18:36:12    

bozocarzu a écrit a écrit :

Oui c'est mysql qu'utilise ludo



Alors il va faloir qu'il ce démerde autrement pour obtenir le même réultat que ce qu'il aurait eu avec sa requête.
C'est chiant de devoir changer de logique dans une partie d'un programme pour simuler une jointure partielle mais a ma conaissance, avec mysql, il y a pas d'autre moyen.

Reply

Marsh Posté le 03-09-2002 à 18:37:48    

uuh.. j'utilise des LEFT JOIN à gogo dans mes script et ça fonctionne super bien...


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 18:40:34    

Sh@rdar a écrit a écrit :

uuh.. j'utilise des LEFT JOIN à gogo dans mes script et ça fonctionne super bien...



Même avec mysql ??? :o
Si c'est le cas, j'en suis vraiment étoné.
Va faloir que j'ailles voir sur free.fr et multimania, si ca marche aussi chez eux.

Reply

Marsh Posté le 03-09-2002 à 18:41:47    

sa marche sur free

Reply

Marsh Posté le 03-09-2002 à 18:45:19    

J'utilise une vieille version en plus (3.23.41) ça fait un moment que c'est supporté, y a qu'a jeter un coup d'oeil à la doc :
 
 
MySQL utilise les syntaxes suivantes pour les commandes de JOIN:  
 
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expression  
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expression  }
 


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 03-09-2002 à 18:49:35    

Sh@rdar a écrit a écrit :

J'utilise une vieille version en plus (3.23.41) ça fait un moment que c'est supporté, y a qu'a jeter un coup d'oeil à la doc :
 
 
MySQL utilise les syntaxes suivantes pour les commandes de JOIN:  
 
table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expression  
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expression  }
 
 



Alors autant pour moi.
Du coup, je pourais faire certains trucs plus facilement que ce que je croyais.

Reply

Marsh Posté le 03-09-2002 à 19:22:52    

whow merci pour vos réponses...
 
ALors donc le LEFT join si ça marche tres bien avec touts mes autres scripts mais là avec je sais pas pk il veut pas.
 
J'essaye tt de suite htmlentites($query) et je vous tiens au courant


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 19:30:31    

bon n'y a t il pas un autre moyen de faire des jointures parcequ'aparement ca veut pas passer :/


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 20:27:50    

javais oublié de mettre DISTINCT............
 
mais c pas  [:xx_xx]


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 20:40:34    

bon j'ai recolé le tout et ca marche comme ca :
 

Code :
  1. $query = '
  2.   SELECT t1.id, t1.nom, t1.infos, t2.titre, t2.id_artistes, t2.id_lyrics 
  3.   FROM artistes As t1 LEFT join chansons As t2 On (t1.id = t2.id_artistes) WHERE ';


 


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 21:28:55    

ludo2604 a écrit a écrit :

bon j'ai recolé le tout et ca marche comme ca :
 

Code :
  1. $query = '
  2.   SELECT t1.id, t1.nom, t1.infos, t2.titre, t2.id_artistes, t2.id_lyrics 
  3.   FROM artistes As t1 LEFT join chansons As t2 On (t1.id = t2.id_artistes) WHERE ';


 
 




 
euh ... y a rien a pres le where ?

Reply

Marsh Posté le 03-09-2002 à 22:48:17    

HappyHarry a écrit a écrit :

 
 
euh ... y a rien a pres le where ?




 
nan mais à la ligne OUI


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 03-09-2002 à 22:48:55    

ludo2604 a écrit a écrit :

 
 
nan mais à la ligne OUI




 
tu veux pas afficher la requete avant qu'elle soit executée, comme ca a deja ete demandé ?

Reply

Marsh Posté le 03-09-2002 à 23:01:19    

HappyHarry a écrit a écrit :

 
 
tu veux pas afficher la requete avant qu'elle soit executée, comme ca a deja ete demandé ?




 
bah c bon ça marche maintenant il me reste un dernier truc à faire si tu peux m'aider...
 
bon ca ca compte tout une table: count(*)
 
mais quand on a des jointures dans la requete comment je peux compter qu'une tble?


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 04-09-2002 à 11:38:59    

ludo2604 a écrit a écrit :

 
 
bah c bon ça marche maintenant il me reste un dernier truc à faire si tu peux m'aider...
 
bon ca ca compte tout une table: count(*)
 
mais quand on a des jointures dans la requete comment je peux compter qu'une tble?



count(table.*) ?
Mais ca te doneras soit le nombre de ligne retourné par la requête, soit le nombre de ligne de la table spécifié qui sont retourné par la requête, soit le nombre de ligne de la table, soit le nombre de ligne de la table qui corespondent à chaque ligne retourné par la requête (s'il n'y a que des distinct, des sum et autres trucs du genre sur une des autres tables de la requête).
Entre les trois permières possibilités, je sais plus quelles sont celles qui sont parfois retrouné par les requêtes, pour la dernière, je sais qu'on peut arrivé à avoir ce résultat là mais c'est parfois dur d'y arriver. ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed