Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/12/2010, 22h23   #1
Invité de passage
 
Homme
Inscription : juillet 2009
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 31
Points : 2
Points : 2
Par défaut JOIN SQL et commande complexe

Bonjour, je suis actuellement en train de développer un moteur de recherche et j'ai passé l'après-midi à programmé une commande SQL permettant de trier par pertinence mes résultats, ça marche très bien.

Le problème c'est que la recherche se fait actuellement en deux temps, sur deux tables différentes avec les mêmes champs (enfin en ce qui concerne cette commande SQL précisément), j'avais fait un while() en PHP et j'affichais les résultats d'une table puis de l'autre. Je viens de réaliser que c'était pas du tout la bonne méthode puisque ça coupe complétement cette idée de pertinence le fait de séparer les résultats des deux tables.

Me rappelant qu'on pouvait joindre des tables en SQL je me suis renseigné (j'ai encore jamais appliqué de jointure, j'en avais pas eu besoin jusque là), mais ça bug, ça ne marche pas du tout...

Je m'en remet donc à vous après avoir longuement chercher une solution, mais sans y arriver...

(La commande SQL n'est ici pas dynamique puisque c'est le résultat d'un echo() - sinon c'est illisible pour vous - mais l'idée est là)

Commande qui marche:

Code :
1
2
3
4
5
6
7
SELECT (title LIKE '%test moteur%') as found_exact, ( (title LIKE '%test%') + (title LIKE '%moteur%') ) AS found_count, id, title, description, rate, preview, genre, type, file_size, vote_up, vote_down, uploader 

FROM directlink 

WHERE (title LIKE '%test%' OR title LIKE '%moteur%') AND (genre = 'game') 

ORDER BY found_exact DESC, found_count DESC, (vote_up-vote_down) DESC LIMIT 50;
Commande qui ne marche pas:

Code :
1
2
3
4
5
6
7
SELECT (title LIKE '%test moteur%') as found_exact, ( (title LIKE '%test%') + (title LIKE '%moteur%') ) AS found_count, id, title, description, rate, preview, genre, type, file_size, vote_up, vote_down, uploader 

FROM directlink, filehosting 

WHERE (title LIKE '%test%' OR title LIKE '%moteur%') AND (genre = 'game') 

ORDER BY found_exact DESC, found_count DESC, (vote_up-vote_down) DESC LIMIT 50;
J'ai bien vérifié, les champs appelés sont exactement les mêmes au niveau de la structure, je ne sais donc pas quoi faire, et vu que la commande est assez compliqué c'est délicat de trifouiller :-(

Merci beaucoup pour votre aide
MaXOhBalle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 22h35   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ce n'est pas une jointure qu'il te faut mais une union.
Une jointure sert a croiser des tables qui ont des données communes.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 22h52   #3
Invité de passage
 
Homme
Inscription : juillet 2009
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 31
Points : 2
Points : 2
Citation:
Envoyé par sabotage Voir le message
Ce n'est pas une jointure qu'il te faut mais une union.
Une jointure sert a croiser des tables qui ont des données communes.
Merci pour cette réponse rapide, en effet je pense que c'est plus vers l'union que je dois me tourner finalement. Après quelques tests, ça retourne toujours une erreur, doit y avoir plein de fautes dans ma commande mais je ne vois pas vraiment...

Code :
(SELECT (title LIKE '%super smash%') as found_exact, ( (title LIKE '%super%') + (title LIKE '%smash%') ) AS found_count, id, title, description, rate, preview, genre, type, file_size, vote_up, vote_down, uploader FROM directlink WHERE (title LIKE '%super%' OR title LIKE '%smash%') AND (genre = 'game') ORDER BY found_exact DESC, found_count DESC, (vote_up-vote_down) DESC LIMIT 50) UNION [ALL] (SELECT (title LIKE '%super smash%') as found_exact, ( (title LIKE '%super%') + (title LIKE '%smash%') ) AS found_count, id, title, description, rate, preview, genre, type, file_size, vote_up, vote_down, uploader FROM filehosting WHERE (title LIKE '%super%' OR title LIKE '%smash%') AND (genre = 'game') ORDER BY found_exact DESC, found_count DESC, (vote_up-vote_down) DESC LIMIT 50);
MaXOhBalle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 22h58   #4
Invité de passage
 
Homme
Inscription : juillet 2009
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2009
Messages : 31
Points : 2
Points : 2
Après quelques corrections évidentes (ORDER BY en repeat ^^) mon script marche apparemment, je renverais un message s'il y a encore un bug visible, merci beaucoup.
MaXOhBalle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h35.


 
 
 
 
Partenaires

Hébergement Web