Probleme de JOIN (je pense) - SQL/NoSQL - Programmation
Marsh Posté le 02-05-2005 à 16:35:13
Mush22 a écrit : Bonjour ! |
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 :
|
Voilà, ça me paraît plus juste, mais je ne promet rien!
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?
Marsh Posté le 03-05-2005 à 12:05:49
Citation : |
Merci pour ce pti bout de code, mais a quoi correspond les PROD et DESC pliz?
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)
Marsh Posté le 03-05-2005 à 12:13:14
ok.
Bon par contre ca ne produit pas l'effet que je souhaitais obtenir ...
Je dois peut etre me tromper dans ma démarche...
Salo***** d'OsCommerce
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
Marsh Posté le 03-05-2005 à 13:58:42
Mush22 a écrit :
|
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
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%')
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.
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
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
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
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.
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
Marsh Posté le 03-05-2005 à 17:10:14
ReplyMarsh 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...
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.
Marsh Posté le 03-05-2005 à 19:04:22
ReplyMarsh 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+
Marsh Posté le 04-05-2005 à 14:25:02
ReplyMarsh Posté le 04-05-2005 à 14:41:29
ReplyMarsh Posté le 04-05-2005 à 15:01:09
Et le but de la constitution Européènne a votre avis c quoi?
Marsh Posté le 04-05-2005 à 16:29:44
Sais pas... Suis Suisse moi alors la constitution européenne ne me concerne pas (malheureusement!)
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.