Probleme de JOIN (je pense)

Probleme de JOIN (je pense) - SQL/NoSQL - Programmation

Marsh Posté le 02-05-2005 à 14:32:29    

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.

Reply

Marsh Posté le 02-05-2005 à 14:32:29   

Reply

Marsh Posté le 02-05-2005 à 16:35:13    

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!

Reply

Marsh Posté le 02-05-2005 à 17:18:42    

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
Reply

Marsh Posté le 03-05-2005 à 12:05:49    

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
Reply

Marsh Posté le 03-05-2005 à 12:09:01    

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
Reply

Marsh Posté le 03-05-2005 à 12:13:14    

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 :/

Reply

Marsh Posté le 03-05-2005 à 12:16:53    

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

Reply

Marsh Posté le 03-05-2005 à 13:58:42    

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

Reply

Marsh Posté le 03-05-2005 à 14:03:42    

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%')

Reply

Marsh Posté le 03-05-2005 à 14:04:19    

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
Reply

Marsh Posté le 03-05-2005 à 14:04:19   

Reply

Marsh Posté le 03-05-2005 à 14:13:24    

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 :)

Reply

Marsh Posté le 03-05-2005 à 14:59:53    

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
Reply

Marsh Posté le 03-05-2005 à 16:13:15    

hum...
 

Reply

Marsh Posté le 03-05-2005 à 16:26:26    

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

Reply

Marsh Posté le 03-05-2005 à 16:48:21    

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
Reply

Marsh Posté le 03-05-2005 à 17:01:37    

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

Reply

Marsh Posté le 03-05-2005 à 17:10:14    

Tu lui diras de reviser les regles de base ;)


---------------
MZP est de retour
Reply

Marsh Posté le 03-05-2005 à 17:22:23    

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

Reply

Marsh Posté le 03-05-2005 à 17:31:00    

:lol:


---------------
MZP est de retour
Reply

Marsh Posté le 03-05-2005 à 17:34:48    

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

Reply

Marsh Posté le 03-05-2005 à 17:47:30    

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
Reply

Marsh Posté le 03-05-2005 à 17:49:19    

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

Reply

Marsh Posté le 03-05-2005 à 19:04:22    

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


---------------
MZP est de retour
Reply

Marsh Posté le 04-05-2005 à 09:37:14    

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

Reply

Marsh Posté le 04-05-2005 à 11:05:59    

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+

Reply

Marsh Posté le 04-05-2005 à 14:25:02    

C'est le but du clusterisé. ;)


---------------
MZP est de retour
Reply

Marsh Posté le 04-05-2005 à 14:33:00    

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

Reply

Marsh Posté le 04-05-2005 à 14:41:29    

cinocks a écrit :

C'est le but du clusterisé. ;)


Tout à fait... Thierry

Reply

Marsh Posté le 04-05-2005 à 15:01:09    

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

Reply

Marsh Posté le 04-05-2005 à 16:29:44    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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