8722 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Dans ma table "fiches" je liste des ressources. Chaque ressource se décompose en différentes colonnes (id, niveau, description, ...).
A partir de mots-clés récupérés dans une chaîne de get je souhaiterais récupérer les ressources contenant TOUS les mots indiqués. Par exemple, si les mots-clés sont "bibeleskas amer flamkuche", je souhaiterais obtenir les ressources contenant ces 3 mots qu'ils se trouvent dans le titre, la description, l'url,...
$kwords est le tableau contenant les mots-clés.
Voici ce que j'ai fait pour définir ma requête :

// Constitution de la requête pour tous les mots-clés
// **************************************************
$i = 0;
foreach ($kwords as $kword) {
  if ($i == 0) {
    $cond_all_kw .= 'titre LIKE \'%'.$kword.'%\' OR url LIKE \'%'.$kword.'%\' OR description LIKE \'%'.$kword.'%\' OR niveau LIKE \'%'.$kword.'%\' OR domaine LIKE \'%'.$kword.'%\' OR sous_domaine LIKE \'%'.$kword.'%\'';
    } else {
    $cond_all_kw .= ' AND titre LIKE \'%'.$kword.'%\' OR url LIKE \'%'.$kword.'%\' OR description LIKE \'%'.$kword.'%\' OR niveau LIKE \'%'.$kword.'%\' OR domaine LIKE \'%'.$kword.'%\' OR sous_domaine LIKE \'%'.$kword.'%\'';
    }
    $i++;
  }
$req_all_kw = 'SELECT * FROM fiches WHERE '.$cond_all_kw.' AND statut=1';


Il semblerait que la condition soit mal définie (on obtient les ressources contenant au moins un des mots et non les 3). Je pense que le AND que j'ajoute entre chaque recherche de mot n'est pas suffisant, il faudrait pouvoir mettre des parenthèses ce qui n'est probablement pas possible...

Merci d'avance Smiley smile
Modifié par jojaba (19 Jun 2013 - 13:49)

SELECT *  
FROM table 
WHERE 
  title LIKE '%rouge%' AND title LIKE '%vert%' AND title LIKE '%bleu%' 
  OR
  description LIKE '%rouge%' AND description LIKE '%vert%' AND description LIKE '%bleu%' 
  ...

Modifié par jb_gfx (19 Jun 2013 - 14:06)
Salut,
c'est faisable simplement :


--Tu veux quelque chose du style : 
SELECT * FROM fiches WHERE ( (url LIKE '%toto%' AND url LIKE '%tutu%') OR  (niveau LIKE '%toto%' AND niveau LIKE '%tutu%') ) AND statut=1;



//Exemple réalisé pour 3 champs, le reste je te laisse faire
//c'est sur le même modèle

//Déclaration des variables
$url    = "(";
$titre  = "(";
$niveau = "(";

//Création des conditions
foreach($kwords as $kword){
	$url    .= "url LIKE '%$kword%' AND";
	$titre  .= "titre LIKE '%$kword%' AND";
	$niveau .= "niveau LIKE '%$kword%' AND";
}

//Suppression des AND en trop et fermeture de parenthèse
$url    = substr($url, -3) . ")"; 
$titre  = substr($url, -3) . ")";
$niveau = substr($url, -3) . ")";

//Composition de la requête - à factoriser
$sql = 'SELECT * FROM fiches WHERE '. $url .' OR ' . $titre . 'OR' . $niveau .' AND statut=1';


Modifié par Zed13 (19 Jun 2013 - 14:13)
Modérateur
jb_gfx a écrit :

SELECT *  
FROM table 
WHERE 
  title LIKE '%rouge%' AND title LIKE '%vert%' AND title LIKE '%bleu%' 
  OR
  description LIKE '%rouge%' AND description LIKE '%vert%' AND description LIKE '%bleu%' 
  ...
Merci jb_gfx, mais je pense que tu n'as pas compris ce que je voulais (c'était pas facile de formuler simplement, un peu pressé aussi).
Zed13 a écrit :
c'est faisable simplement :
On peut donc utiliser des parenthèses (je ne savais pas), c'est ce qui va me sauver je pense. Dès que j'ai testé, je reviens ici et vous donne le code.

Merci. Smiley smile
Modérateur
C'est bon, ça fonctionne ainsi :
// Constitution de la requête pour tous les mots-clés
// **************************************************
$i = 0;
foreach ($kwords as $kword) {
  if ($i == 0) {
    $cond_all_kw .= '(titre LIKE \'%'.$kword.'%\' OR url LIKE \'%'.$kword.'%\' OR description LIKE \'%'.$kword.'%\' OR niveau LIKE \'%'.$kword.'%\' OR domaine LIKE \'%'.$kword.'%\' OR sous_domaine LIKE \'%'.$kword.'%\')';
  } else {
    $cond_all_kw .= ' AND (titre LIKE \'%'.$kword.'%\' OR url LIKE \'%'.$kword.'%\' OR description LIKE \'%'.$kword.'%\' OR niveau LIKE \'%'.$kword.'%\' OR domaine LIKE \'%'.$kword.'%\' OR sous_domaine LIKE \'%'.$kword.'%\')';
  }
 $i++;
}
$req_all_kw = 'SELECT * FROM fiches WHERE '.$cond_all_kw.' AND statut=1';


Merci encore
Modifié par jojaba (19 Jun 2013 - 14:29)
jojaba a écrit :
Merci jb_gfx, mais je pense que tu n'as pas compris ce que je voulais (c'était pas facile de formuler simplement, un peu pressé aussi).


J'ai zappé les parenthèses (nécessaires parce que OR est prioritaire face à AND) mais à part ça j'avais bien compris, j'ai fait la même requête que Zed au niveau des champs.

Regarde :


SELECT *  
FROM table 
WHERE 
  ( ( title LIKE '%rouge%' AND title LIKE '%vert%' AND title LIKE '%bleu%' )
  OR
  ( description LIKE '%rouge%' AND description LIKE '%vert%' AND description LIKE '%bleu%' ) )
  ...