Requete Mysql AIDE svp !
10 messages
• Page 1 sur 1
- steeve971
- Nouveau WRInaute

- Messages: 6
- Inscription: 23 Déc 2004
Requete Mysql AIDE svp !
Bonjour,
J'ai un annuraire de type pages jaunes. La requete Mysql fonctionne mais est trop précise.
Exemple : Lorsque tape le mot clés "infirmières", il y a 20 réponses.
Avec le mot clé "infirmiers", j'ai 250 réponses.
Comment faire en sorte que lorsque je tape "infirmières", que ca me retourne les 20 réponses mais également les 250 réponses.
En gros, je voudrais que la requete puisse être élargie aux mots qui ressemblent à celui qui a été tapé. (en recherchant "infirmières" que ca me retourne également les réponses correspondant au mot "infirmiers")
Ma requete
$query = "select listid,cid,listname,description,addr,city,state,country,postcode,phone,website ";
$query.="FROM yp_list where (listname like '%$search%' OR description like '%$search%') ";
Merci bcp de votre aide
@+
J'ai un annuraire de type pages jaunes. La requete Mysql fonctionne mais est trop précise.
Exemple : Lorsque tape le mot clés "infirmières", il y a 20 réponses.
Avec le mot clé "infirmiers", j'ai 250 réponses.
Comment faire en sorte que lorsque je tape "infirmières", que ca me retourne les 20 réponses mais également les 250 réponses.
En gros, je voudrais que la requete puisse être élargie aux mots qui ressemblent à celui qui a été tapé. (en recherchant "infirmières" que ca me retourne également les réponses correspondant au mot "infirmiers")
Ma requete
$query = "select listid,cid,listname,description,addr,city,state,country,postcode,phone,website ";
$query.="FROM yp_list where (listname like '%$search%' OR description like '%$search%') ";
Merci bcp de votre aide
@+
- code
- WRInaute impliqué

- Messages: 648
- Inscription: 29 Juil 2005
Bonjour,
tout d'abord avant d'envoyer la requete, tu devrais traiter la chaine "$search" pour :
1 - enlever les espaces en début et fin (avec trim($search); )
2 - remplacer tous les accents par les voyelles non accentuées (rien qu'avec ça ta requete renverrait les résultats pour infimieres et infirmiers si tu tapes la recherche "infirmier"
)
3 - enfin, si tu veux faire une recherche plus globale tu dois :
a) créer un index fulltext sur ta table myslq pour ton champ 'listname'
b) utiliser une requete de ce style à la place de LIKE :
"SELECT listid, cid, description, addr, city, state, country, postcode, phone, website, MATCH (listname) AGAINST ('$search') as score FROM yp_list WHERE MATCH (listname) AGAINST ('$search') OR description like '%$search%' ORDER BY score DESC";
La documentation Mysql à ce sujet : http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html
tout d'abord avant d'envoyer la requete, tu devrais traiter la chaine "$search" pour :
1 - enlever les espaces en début et fin (avec trim($search); )
2 - remplacer tous les accents par les voyelles non accentuées (rien qu'avec ça ta requete renverrait les résultats pour infimieres et infirmiers si tu tapes la recherche "infirmier"
3 - enfin, si tu veux faire une recherche plus globale tu dois :
a) créer un index fulltext sur ta table myslq pour ton champ 'listname'
b) utiliser une requete de ce style à la place de LIKE :
"SELECT listid, cid, description, addr, city, state, country, postcode, phone, website, MATCH (listname) AGAINST ('$search') as score FROM yp_list WHERE MATCH (listname) AGAINST ('$search') OR description like '%$search%' ORDER BY score DESC";
La documentation Mysql à ce sujet : http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html
- steeve971
- Nouveau WRInaute

- Messages: 6
- Inscription: 23 Déc 2004
Bonjour !
Merci beaucoup pour la réponse rapide.
J'ai donc effectué cette requete :
SELECT listid, cid, description, addr, city, state, country, postcode, phone, website, MATCH (listname) AGAINST ( '%infirmieres%' ) as score FROM yp_list WHERE MATCH (listname) AGAINST ( '%infirmieres%' ) OR description like '%infirmieres%' ORDER BY score DESC
MAIS ca me retourne ce message d'erreur :
ErrorCan't find FULLTEXT index matching the column list
Et j'ai pourtant fait la requette suivante :
ALTER TABLE `yp_list` ADD INDEX ( `listname` )
Une idée pour résoudre ce pb ?
ET ne faut-il pas altérer également le champ "description". J'aimerai que la recherche soit élargie aussi sur ce champ.
Merci bcp
Merci beaucoup pour la réponse rapide.
J'ai donc effectué cette requete :
SELECT listid, cid, description, addr, city, state, country, postcode, phone, website, MATCH (listname) AGAINST ( '%infirmieres%' ) as score FROM yp_list WHERE MATCH (listname) AGAINST ( '%infirmieres%' ) OR description like '%infirmieres%' ORDER BY score DESC
MAIS ca me retourne ce message d'erreur :
ErrorCan't find FULLTEXT index matching the column list
Et j'ai pourtant fait la requette suivante :
ALTER TABLE `yp_list` ADD INDEX ( `listname` )
Une idée pour résoudre ce pb ?
ET ne faut-il pas altérer également le champ "description". J'aimerai que la recherche soit élargie aussi sur ce champ.
Merci bcp
- steeve971
- Nouveau WRInaute

- Messages: 6
- Inscription: 23 Déc 2004
Merci bcp de répondre !
J'ai mis en latin 1.
Et pour les accents, j'avais réglé cela comme cela :
function SansAccents($chaine) {
return( strtr( $chaine,
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ) );
}
$search = SansAccents($search);
Avant de mettre cette fonction : en tapant "infirmières", j'avais 0 réponses.
Avec ces quelques lignes de codes, j'ai les 20 réponses.
Merci encore
J'ai mis en latin 1.
Et pour les accents, j'avais réglé cela comme cela :
function SansAccents($chaine) {
return( strtr( $chaine,
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ) );
}
$search = SansAccents($search);
Avant de mettre cette fonction : en tapant "infirmières", j'avais 0 réponses.
Avec ces quelques lignes de codes, j'ai les 20 réponses.
Merci encore
- steeve971
- Nouveau WRInaute

- Messages: 6
- Inscription: 23 Déc 2004
Structure de la table si cela peut aider :
- Code: Tout sélectionner
--
-- Structure de la table `yp_list`
--
CREATE TABLE `yp_list` (
`listid` int(11) NOT NULL auto_increment,
`cid` int(11) NOT NULL default '0',
`listname` varchar(255) collate latin1_general_ci NOT NULL,
`uname` varchar(60) collate latin1_general_ci NOT NULL,
`description` varchar(255) collate latin1_general_ci NOT NULL,
`addr` varchar(100) collate latin1_general_ci default NULL,
`addr2` varchar(100) collate latin1_general_ci default NULL,
`city` varchar(80) collate latin1_general_ci NOT NULL,
`state` varchar(50) collate latin1_general_ci default NULL,
`postcode` varchar(30) collate latin1_general_ci default NULL,
`country` int(11) NOT NULL default '0',
`phone` varchar(80) collate latin1_general_ci NOT NULL,
`tollfree` varchar(100) collate latin1_general_ci default NULL,
`mobile` varchar(30) collate latin1_general_ci default NULL,
`fax` varchar(30) collate latin1_general_ci default NULL,
`email` varchar(200) collate latin1_general_ci default NULL,
`website` varchar(255) collate latin1_general_ci default NULL,
`addedon` int(11) NOT NULL default '0',
`updatedon` int(11) NOT NULL default '0',
`logo` varchar(40) collate latin1_general_ci default NULL,
PRIMARY KEY (`listid`),
KEY `addedon` (`addedon`),
KEY `addr` (`addr`),
KEY `addr2` (`addr2`),
KEY `cid` (`cid`),
KEY `city` (`city`),
KEY `country` (`country`),
KEY `email` (`email`),
KEY `fax` (`fax`),
KEY `listid` (`listid`),
KEY `logo` (`logo`),
KEY `mobile` (`mobile`),
KEY `phone` (`phone`),
KEY `postcode` (`postcode`),
KEY `state` (`state`),
KEY `tollfree` (`tollfree`),
KEY `uname` (`uname`),
KEY `updatedon` (`updatedon`),
KEY `website` (`website`),
FULLTEXT KEY `listname` (`listname`),
FULLTEXT KEY `description` (`description`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=46862 ;
-

Bool - WRInaute passionné

- Messages: 1290
- Inscription: 26 Fév 2004
Hello,
pour les accents et majuscules / minuscules, MySQL s'en charge déjà tout seul en interne. Si cela ne fonctionnait pas chez toi, c'est que tu avais un soucis d'encodage dans ton code ou dans ta base.
Mais évidement il ne se charge pas des conversions masculin/féminin ni singulier/pluriel... ni même des synonymes.
Tout ça, c'est à toi de le prendre en charge...
pour les accents et majuscules / minuscules, MySQL s'en charge déjà tout seul en interne. Si cela ne fonctionnait pas chez toi, c'est que tu avais un soucis d'encodage dans ton code ou dans ta base.
Mais évidement il ne se charge pas des conversions masculin/féminin ni singulier/pluriel... ni même des synonymes.
Tout ça, c'est à toi de le prendre en charge...
- steeve971
- Nouveau WRInaute

- Messages: 6
- Inscription: 23 Déc 2004
Bonjour !
Merci pour la réponse...
"Mais évidement il ne se charge pas des conversions masculin/féminin ni singulier/pluriel... ni même des synonymes"
Comment faire donc ??
Par où je dois chercher pour trouver cela (masculin/féminin ni singulier/pluriel)?
Merci de la réponse
Merci pour la réponse...
"Mais évidement il ne se charge pas des conversions masculin/féminin ni singulier/pluriel... ni même des synonymes"
Comment faire donc ??
Par où je dois chercher pour trouver cela (masculin/féminin ni singulier/pluriel)?
Merci de la réponse
-

Bool - WRInaute passionné

- Messages: 1290
- Inscription: 26 Fév 2004
Je ne sais pas si des solutions "toutes prêtes" existent, mais je pense que c'est à toi de développer cela avec tes mimines : un système de conversion féminin => masculin (dans la mesure du possible), et de pluriel => singulier (avec des exceptions ?) ainsi qu'un éventuel dictionnaire de synonymes pour proposer des requêtes "proches".
Pour le dico des synonymes, il doit y avoir quelques dico "libres" : voir coté OpenOffice par exemple, je ne sais pas s'ils le sont.
Pour les conversions, bah c'est du français... parmi les trucs tout bete : supprimer le "S" en fin de mot si le mot n'existent pas dans le dictionnaire tel quel.
Prendre en compte les cas de type "cheval" => "chevaux", et les classiques "hiboux", "choux", etc.
Il faudrait sûrement commencer par rechercher des dictionnaires libres je pense.
Une autre solution plus simple, serait de créer une petite table de correspondance gérées "manuellement".
Et de se baser sur les distances levenshtein des mots pour le reste.
Ou encore de faire un mix de tout ça...
Pour le dico des synonymes, il doit y avoir quelques dico "libres" : voir coté OpenOffice par exemple, je ne sais pas s'ils le sont.
Pour les conversions, bah c'est du français... parmi les trucs tout bete : supprimer le "S" en fin de mot si le mot n'existent pas dans le dictionnaire tel quel.
Prendre en compte les cas de type "cheval" => "chevaux", et les classiques "hiboux", "choux", etc.
Il faudrait sûrement commencer par rechercher des dictionnaires libres je pense.
Une autre solution plus simple, serait de créer une petite table de correspondance gérées "manuellement".
Et de se baser sur les distances levenshtein des mots pour le reste.
Ou encore de faire un mix de tout ça...
10 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Aide php/mysql requête svp
- aide requete MYSQL
- Aide pour requête MySQL
- Aide requête MySQL avec count
- Aide pour une requête MySQL
- Aide pour optimiser l'écriture d'une requete PHP/MYSQL
- [mysql] trier les résultats d'une requête selon une table non liée à la requête
- Besoin d'aide sur requête svp.
- Requete Mysql ?
- Aide SVP
- Google API : guide de développement de l'API Google - 20-09-2002
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Les différents systèmes de mise en cache des données - 16-08-2010
- Passage à l'heure d'été/hiver sur un forum phpBB - 31-10-2010
- Nombre moyen de mots par requête : statistiques AOL Août 2006 - 10-08-2006
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006 - 11-08-2006
- Script de mise en cache des pages (PHP MySQL) - 09-08-2010
- GoogleStats : analyse temps réel des visites de Google sur votre site - 02-10-2002
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
