Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2111 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme de JOIN (je pense)

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de JOIN (je pense)

n°1068787
Mush22
Le temps se chargera du reste.
Posté le 02-05-2005 à 14:32:29  profilanswer
 

Bonjour !
 
Voila mon probleme, je fais un moteur de recherche, qui doit rechercher un produit, avec des condition WHERE vers plusieurs tables.
 J'utilise donc ca :
 
$sql_rech_terme = "SELECT *  
FROM products_description,products WHERE products.products_status = '1' AND (products_description.products_name LIKE '%$rech%' OR products_description.products_description LIKE '%$rech%')";
 
dans la premier table(products) je stock l'url de l'image ainsi qu'un champ "statut".
dans la deuxieme (products_description), je stock le nom et la description du produit.
 
Pour que le résultat soit le meme, issu des deux bases, j'utilise un JOIN :
 
$sql_rech_terme = "SELECT *  
FROM products_description,products
LEFT JOIN products_description ON products_description.products_id = products.products_id
WHERE products.products_status = '1'  
AND (products_description.products_name LIKE '%$rech%' OR products_description.products_description LIKE '%$rech%')";
 
Pour que quand j'affiche le résultat, l'id du resultat trouvé dans la premiere table, soit le meme que dans la deuxieme. Probleme, ca n'a pas l'air d fonctionner.
 
Voyez vous un problemes?
 
Merci.

mood
Publicité
Posté le 02-05-2005 à 14:32:29  profilanswer
 

n°1068940
gfa
Posté le 02-05-2005 à 16:35:13  profilanswer
 

Mush22 a écrit :

Bonjour !
...
Pour que quand j'affiche le résultat, l'id du resultat trouvé dans la premiere table, soit le meme que dans la deuxieme. Probleme, ca n'a pas l'air d fonctionner.
 
Voyez vous un problemes?
 
Merci.


 
Alors comme tu ne nous dis pas quel est exactement ton problème, je pense que c'est difficile de t'aider.
 
Néanmoins, dans ta requête, tu utilises une syntaxe un peu étrange pour le JOIN. Je ne sais pas quel SGBD tu utilises mais pour moi, ta syntaxe est étrange...  
 
Ensuite, je ne comprends pas bien pourquoi tu fais un LEFT JOIN plutôt qu'un INNER JOIN vu que de toute manière ta requêtre se base sur une condition dans la table "de droite" :)
 
Bref, moi j'écrirais ta requête plutôt de cette manière:

Code :
  1. SELECT * FROM products_description DESC
  2. INNER JOIN products PROD ON DESC.Products_id = PROD.products_id
  3. WHERE PROD.products_status = '1' AND
  4. (DESC.products_name LIKE '%$rech%' OR DESC.products_description LIKE '%$rech%')


Voilà, ça me paraît plus juste, mais je ne promet rien!

n°1069031
cinocks
Posté le 02-05-2005 à 17:18:42  profilanswer
 

produit cartesien entre les 2 tables dans la premiere requete. :)
 
Et de nouveau un produit cartesien dans la seconde. Pkoi tu remets 'products_description' alors qu'ell figure dejà dans la jointure?


---------------
MZP est de retour
n°1070233
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 12:05:49  profilanswer
 

Citation :


Code :
 
    * SELECT * FROM products_description DESC
    * INNER JOIN products PROD ON DESC.Products_id = PROD.products_id
    * WHERE PROD.products_status = '1' AND  
    * (DESC.products_name LIKE '%$rech%' OR DESC.products_description LIKE '%$rech%')


Merci pour ce pti bout de code, mais a quoi correspond les PROD et DESC pliz?


Message édité par Mush22 le 03-05-2005 à 12:06:24
n°1070241
cinocks
Posté le 03-05-2005 à 12:09:01  profilanswer
 

aux alias des tables indiquées dans le FROM
 
Ce n'est qu'un renommage. C'est interessant dans le sens où ca evite de reecrire le nom complet de la table lorsque les prefixes sont necessaires. Et c'est indispensable si tu fais une requete avec 2 fois la mm table.
 
Ex : SELECT a.id, b.id FROM toto a INNER JOIN toto b ON (b.date=a.date)


---------------
MZP est de retour
n°1070252
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 12:13:14  profilanswer
 

ok.
 
Bon par contre ca ne produit pas l'effet que je souhaitais obtenir :D...
Je dois peut etre me tromper dans ma démarche...
Salo***** d'OsCommerce :/

n°1070259
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 12:16:53  profilanswer
 

Citation :

Alors comme tu ne nous dis pas quel est exactement ton problème, je pense que c'est difficile de t'aider.


 
Quand j'execute une requete toute simple avec un SELECT et un WHERE, je produit trouvé grace a cette requete n'est pas le meme dans les deux bases :
 
Si ma recherche est "Nokia 3410", il va correctement récupérer son nom et sa description dans la table products_description, mais il va récuperer le premier champ de la base products. Hors je voudrais qu'il récupere le champ ou le products_id de la table products_description correspond au products_id de la table products.
 
Je me demande si j'ai été clair :D

n°1070386
gfa
Posté le 03-05-2005 à 13:58:42  profilanswer
 

Mush22 a écrit :

Citation :

Alors comme tu ne nous dis pas quel est exactement ton problème, je pense que c'est difficile de t'aider.


 
Quand j'execute une requete toute simple avec un SELECT et un WHERE, je produit trouvé grace a cette requete n'est pas le meme dans les deux bases :
 
Si ma recherche est "Nokia 3410", il va correctement récupérer son nom et sa description dans la table products_description, mais il va récuperer le premier champ de la base products. Hors je voudrais qu'il récupere le champ ou le products_id de la table products_description correspond au products_id de la table products.
 
Je me demande si j'ai été clair :D


Mais tu obtiens ce résultat avec quelle requête? Ta première requête ou celle que je t'ai suggérée?
 
Tiens-nous au courant

n°1070400
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 14:03:42  profilanswer
 

avec une requete toute simple, sans JOIN:
 
SELECT products_status, products_description, products_name FROM products,products_description WHERE products.products_status = 1 AND( products_description.products_name LIKE '%$rech%' OR products_description.products_description LIKE '%$rech%')

n°1070401
cinocks
Posté le 03-05-2005 à 14:04:19  profilanswer
 

Je pense, le plus simple, serait que tu nous dises ce que tu as, et ce que tu voudrais obtenir.
 
Actuellement, comme je te l'ai dit, aucune de tes requetes ne peut etre bonne etant donné la construction. Elles vont retourner qq chose. Mais pas ce que tu cherches (dans un sens strict). Par chance, le resultat peut etre le meme.


---------------
MZP est de retour
mood
Publicité
Posté le 03-05-2005 à 14:04:19  profilanswer
 

n°1070424
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 14:13:24  profilanswer
 

ok lol.
 
Faisons au plus clair :
dans la table products, je dois récupérer une url image et un statut(1/0)
dans la table products_description, je dois récuperer le nom du produit, et sa description.
dans les deux tables, il y a un champ products_id, pour identifier le produit trouvé.
Au final, je veux afficher un seul résultat, avec l'image, le nom du produit, sa description tout ca seulement si on statut est a 1.
Actuellement, avec la requete du dessus, j'ai le nom, la description mais le status et l'url de l'image ne sont pas les bons, ils correspondent a la premiere ligne de la table products.
 
Voili voilou :)

n°1070495
cinocks
Posté le 03-05-2005 à 14:59:53  profilanswer
 

Oki, normal, puisque comme je te l'ai dit, ta requete fais un produit cartesien. Il te faut:
 
SELECT b.imge, b.nom, b.description
FROM products a INNER JOIN products_description b ON (b.id_product =a.id_product)
WHERE a.id_product =@ton_id
AND a.statut =1
 
Elle va te retourner les infos concernant le produit @ton_id s'il est actif.
 
Si tu veux faire une recherche sur un libellé, remplace le where par:
 
WHERE b.nom LIKE "rech%"
AND a.statut =1


---------------
MZP est de retour
n°1070626
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 16:13:15  profilanswer
 

hum...
 

n°1070650
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 16:26:26  profilanswer
 

E fait je me rends compte que je vais devoir faire une requete de 3km d elong au moins...
 
Merci pour l'aide :)

n°1070685
cinocks
Posté le 03-05-2005 à 16:48:21  profilanswer
 

je comprend où est ton probleme. D'apres ton ennoncé, la requete ne doit pas faire plus des 3 lignes indiquées.


---------------
MZP est de retour
n°1070698
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 17:01:37  profilanswer
 

oui, mais en fait, je dois récupérer pas mal de truc qui sont stockés dans d'autre bases encore. C un vrai merdier.
 
Je deteste passer derriere quelqu'un d'autre pour debbuger

n°1070712
cinocks
Posté le 03-05-2005 à 17:10:14  profilanswer
 

Tu lui diras de reviser les regles de base ;)


---------------
MZP est de retour
n°1070727
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 17:22:23  profilanswer
 

moué...
 
et moi je dois revoir le langage SQL...

n°1070738
cinocks
Posté le 03-05-2005 à 17:31:00  profilanswer
 

:lol:


---------------
MZP est de retour
n°1070745
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 17:34:48  profilanswer
 

Non mais, blague appart,
Ces histoires de JOIN et INNER, mêlées aux alias, c'est aps evident a integrer...
 
J'ai des infos de 6 ou 7 bases différentes a récupérer...
Ma requete prend de l'ampleur, je me demande comment je vais m'en sortir lol.
 
M'enfin... :D

n°1070757
cinocks
Posté le 03-05-2005 à 17:47:30  profilanswer
 

Si les bases sont sur le memes serveurs, ca se fait tres bien.
Dans le cas contraire, les tables proxies sont là pour t'aider. ;)


---------------
MZP est de retour
n°1070761
Mush22
Le temps se chargera du reste.
Posté le 03-05-2005 à 17:49:19  profilanswer
 

Jmé trompé, pas 6 ou 7 bases, mais 6 ou 7 tables :d

n°1070851
cinocks
Posté le 03-05-2005 à 19:04:22  profilanswer
 

bah c'est pas grand chose alors. Ca va tres vite.


---------------
MZP est de retour
n°1071302
Mush22
Le temps se chargera du reste.
Posté le 04-05-2005 à 09:37:14  profilanswer
 

lol, ouais...
 
C censé aller tres vite :d

n°1071448
gfa
Posté le 04-05-2005 à 11:05:59  profilanswer
 

Pour ma part, il m'est parfois arrivé de faire des JOIN sur plus de 10 tables sans aucuns problèmes - de performance en tout cas, c'est vrai que la lecture de la requête n'est pas forcément simple. Il faut juste vérifier que tu as bien des index clusterisé sur tes primary key. Pour autant, bien sûr que tes JOIN se font sur des PK :)
 
Enfin je sais pas vous mais de mon côté il me semble que c'est plus rapide si t'as un index clusterisé sur la PK... En tout cas sous SQL Server, pour les autres SGBD je ne peux pas me prononcer!
 
A+

n°1071741
cinocks
Posté le 04-05-2005 à 14:25:02  profilanswer
 

C'est le but du clusterisé. ;)


---------------
MZP est de retour
n°1071749
Mush22
Le temps se chargera du reste.
Posté le 04-05-2005 à 14:33:00  profilanswer
 

Ah ! ...
(aheum...)
 
:D

n°1071763
gfa
Posté le 04-05-2005 à 14:41:29  profilanswer
 

cinocks a écrit :

C'est le but du clusterisé. ;)


Tout à fait... Thierry

n°1071820
Mush22
Le temps se chargera du reste.
Posté le 04-05-2005 à 15:01:09  profilanswer
 

Et le but de la constitution Européènne a votre avis c quoi?
:d

n°1072083
gfa
Posté le 04-05-2005 à 16:29:44  profilanswer
 

Sais pas... Suis Suisse moi alors la constitution européenne ne me concerne pas (malheureusement!)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme de JOIN (je pense)

 

Sujets relatifs
Problème de connexion AccessProbleme de lecture d'arborescence
[WiP PHP/CSS] 3 Mars: Problème de marge CSSpetit probleme de JScrollPane
[CSS] 'overflow' et firefox 1.0.3 = problèmeProblème shell d'un débutant HELP!
problème SQL moteur de recherche[resolu] ie - probleme avec l'ascenseur vertical
Problème sur livre d'or de mon siteProbleme odbc
Plus de sujets relatifs à : Probleme de JOIN (je pense)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR