Mysql, pertinence

2 réponses
AuteurMessage

ddpetit |
Modérateur

Photo de ddpetit

Inscrit le : 03/05/2006

# Le 22/08/2009 à 15:37

Bonjour à tous les webworkerclubiens

Je suis actuellement en train de travailler sur mon site internet, en particulier sur un moteur de recherche pour les véhicules d'occasion. J'ai 3 tables : marque, modele, annonces

Je voudrais réussir à trouver les marques et modèles les plus pertinentes avec la requete de l'internaute.
Voici ce que j'ai pour le moment quand la personne cherche pour une Audi Q5 :


SELECT ma.nom AS nom_ma, mo.nom AS nom_mo, COUNT(a.id) AS nb_annonces
FROM annoncesneuf AS a
INNER JOIN marque AS ma ON ma.id = a.marque
INNER JOIN modele AS mo ON mo.id = a.modele
WHERE
ma.nom IN ('audi','Q5') OR
mo.nom IN ('audi','Q5') OR
a.version IN ('audi','Q5')
GROUP BY mo.id LIMIT 5


Le problème c'est que ce genre de requête n'est pas du tout pertinente.
Comment faire ?

Loccasion.com - Vente de voitures d'occasionOuvrir dans une nouvelle fenetre - Mandataire AutoOuvrir dans une nouvelle fenetre

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 22/08/2009 à 17:43

Je comprends pas trop ce que tu cherches à faire car avec ta requête tu fais tes 2 jointures sur ton tuple annoncesneuf alors forcément ça va te sortir la marque et le modèle de ton annonce.

En plus ton GROUP BY devrait plutôt être sur a.id.

Tu veux pas plutôt avoir les annonces qui concernent la marque et/ou le modèle recherchés ?
Je ferai ça :

SELECT		ID_ANNONCE, TITRE_ANNONCE
FROM ANNONCESNEUF
WHERE MARQUE IN (SELECT ID
FROM MARQUE
WHERE NOM IN ('audi', 'Q5'))
OR
MODELE IN (SELECT ID
FROM MODELE
WHERE NOM IN ('audi', 'Q5'))
OR
VERSION IN ('audi', 'Q5');
LIMIT 5

Non ?

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

bhamp0 | Benjamin
Membre

Photo de bhamp0

Inscrit le : 09/05/2005

# Le 22/08/2009 à 19:14

Perso, je pars du principe que si on a trouvé un modèle correspondant à la recherche, on ne va pas chercher une marque correspondante (avec les deux requêtes actuelles, on renvoie en gros toutes les Audi ...)

Donc, on essaie de trouver le modèle, et sinon on essaie de trouver la marque.


SELECT ma.nom AS nom_ma, mo.nom AS nom_mo, COUNT(a.id) AS nb_annonces
FROM annoncesneuf AS a
INNER JOIN marque AS ma ON ma.id = a.marque
INNER JOIN modele AS mo ON mo.id = a.modele
WHERE
mo.nom IN ('audi','Q5')
OR
( mo.nom NOT IN ('audi','Q5') AND ma.nom IN ('audi','Q5') )


Ce qui fait :
1. l'utilisateur cherche "Audi" => pas de modèle ayant de ce nom => on renvoie toutes les Audi
2. l'utilisateur cherche "Q5" => un modèle ayant ce nom => on renvoie tous les Q5
3. l'utilisateur cherche "Audi Q5" => un modèle a le nom "Q5", on ne cherche pas parmi les marques (on pourrait améliorer ce point afin de chercher aussi parmi les marques et faire un AND) => on renvoie tous les Q5
4. l'utilisateur cherche "Audi Q4" => pas de modèle "Q4" ou "Audi" => on renvoie toutes les Audi
5. l'utilisateur cherche "Renault Q5" => un modèle a le nom "Q5" => on renvoie tous les Q5 (améliorable suivant le point 3)

Quand on voit c'qu'on voit, et qu'on entend c'qu'on entend, on a raison d'penser c'qu'on pense !

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 2:28:53 | Généré en 2.96ms | Contacts | Mentions légales |