Page 1 sur 1

requete avec mot cle inclus dans un autre

Posté : 20 déc. 2007, 03:16
par Chile
Bonjour,
J'ai un petit souci lors d'une requete dans ma base :?
Voila, j'ai un menu, avec plusieurs cathégories de produits. Lorsque je souhaite faire sortir tous les produits qui contiennent 'rings' dans une colonne, ils me sort aussi tous ceux qui contiennent 'earings' ..car 'earings' contient 'rings'...je suppose :wink:
Voici l'appel sur la page qui affiche :
mysql_select_db($database_bque, $bque);
$query_annuaire = sprintf("SELECT * FROM produits WHERE produits.rubannu1angl LIKE '%%%s%%'  OR produits.rubannu2angl  LIKE '%%%s%%' OR produits.rubdetail2angl  LIKE '%%%s%%' AND rubannu1angl IN ('silver lapis lazuli','silver lapis lazuli malachite') ORDER BY titre ASC", $motcle_annuaire, $motcle_annuaire, $motcle_annuaire);
$query_limit_annuaire = sprintf("%s LIMIT %d, %d", $query_annuaire, $startRow_annuaire, $maxRows_annuaire);
$annuaire = mysql_query($query_limit_annuaire, $bque) or die(mysql_error());
// $row_annuaire = mysql_fetch_assoc($annuaire);





si quelqu'un a deja eu ce genre d'ennui et sait comment le regler :lol:

bonnes fêtes de fin d'année à tous

voici ma table

Code : Tout sélectionner

CREATE TABLE `produits` ( `id` int(11) NOT NULL auto_increment, `ref` varchar(50) NOT NULL default '', `rubannu1` varchar(50) default '0', `rubannu1esp` varchar(50) default NULL, `rubannu1angl` varchar(50) default NULL, `rubannu2` varchar(50) default '0', `rubannu2esp` varchar(50) default NULL, `rubannu2angl` varchar(50) default NULL, `rubdetail1` varchar(50) default NULL, `rubdetail1esp` varchar(50) default NULL, `rubdetail1angl` varchar(50) default NULL, `rubdetail2` varchar(255) default NULL, `rubdetail2esp` varchar(255) default NULL, `rubdetail2angl` varchar(255) default NULL, `titre` varchar(100) default NULL, `titulo` varchar(100) default NULL, `tittle` varchar(100) default NULL, `prix_ht` decimal(11,1) default '0.0', `prix_ttc` decimal(11,1) default '0.0', `disponibilite` varchar(10) default NULL, `resume` text, `descripcion` text, `description` text, `pays` varchar(50) default '0', `pais` varchar(50) default NULL, `country` varchar(50) default NULL, `photo1p` varchar(255) default NULL, `photo1g` varchar(255) default NULL, `photo2p` varchar(255) default NULL, `photo2g` varchar(255) default NULL, `photo3p` varchar(255) default NULL, `photo3g` varchar(255) default NULL, `dimensions` varchar(255) default '0', `medidas` varchar(255) default '0', `size` varchar(255) default '0', `poids` int(11) default NULL, `commentaires` text, `comentarios` text, `comments` text, `lettre` varchar(25) NOT NULL default 'O', `ethnique` varchar(50) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `ref` (`ref`), KEY `rubannu1` (`rubannu1`), KEY `rubannu2` (`rubannu2`), KEY `pays` (`pays`), KEY `rubdetail1` (`rubdetail1`), KEY `rubdetail2` (`rubdetail2`), KEY `titre` (`titre`), KEY `country` (`country`), KEY `dimensions` (`dimensions`), KEY `disponibilite` (`disponibilite`), KEY `id` (`id`), KEY `lettre` (`lettre`), KEY `medidas` (`medidas`), KEY `pais` (`pais`), KEY `photo1g` (`photo1g`), KEY `photo1p` (`photo1p`), KEY `photo2g` (`photo2g`), KEY `photo2p` (`photo2p`), KEY `photo3g` (`photo3g`), KEY `photo3p` (`photo3p`), KEY `poids` (`poids`), KEY `prix_ht` (`prix_ht`), KEY `prix_ttc` (`prix_ttc`), KEY `rubannu1angl` (`rubannu1angl`), KEY `rubannu1esp` (`rubannu1esp`), KEY `rubannu2angl` (`rubannu2angl`), KEY `rubannu2esp` (`rubannu2esp`), KEY `rubdetail1angl` (`rubdetail1angl`), KEY `rubdetail1esp` (`rubdetail1esp`), KEY `rubdetail2angl` (`rubdetail2angl`), KEY `rubdetail2esp` (`rubdetail2esp`), KEY `size` (`size`), KEY `tittle` (`tittle`), KEY `titulo` (`titulo`) ) ENGINE=MyISAM AUTO_INCREMENT=229 DEFAULT CHARSET=latin1 AUTO_INCREMENT=229 ;
:P

Posté : 20 déc. 2007, 09:39
par d0m
je pense que directement tu ne peux pas.
Si tu veux les mots qui contiennent rings obligatoirement tu auras earingsavec.
Le seul moyen est de faire des cas à part avec une liste de mots à ne pas prendre en compte pour chaque mot clé. Genre :

Code : Tout sélectionner

SELECT... ... WHERE produits.rubannu1angl LIKE '%%%rings%%' AND produits.rubannu1angl NOT LIKE '%%%earings%%'

Posté : 20 déc. 2007, 11:59
par Jules Petibidon
hello,

je suis un peu rouillé donc à prendre au conditionnel :

primo : "%" veut dire "n'importe quoi autant que tu veux" donc pas la peine d'en mettre 36, un seul suffit avant et apres.

deuzio : si tu veux uniquement le mot ring par exemple, as tu essayé les espaces ? "% ring %" par exemple ? Cette méthode reste limitée, je te laisse deviner pourquoi. La meilleure option serait peut-être d'utiliser "MATCH" au lieu de "LIKE".

troizio : à la description de ta table, tu as un index sur chaque champ... ce qui est inutile et contre productif. Essaye de mettre un index uniquement sur les champs qui sont susceptibles d'apparaitre dans une clause "where", et dans le cas peu probable ou ils le sont tous, essaye de mettre des index uniquement sur ceux qui le sont le plus souvent.