2010-06-07 3 views
0

Je souhaite ajouter une clause WHERE à une requête de recherche en texte intégral (pour la limiter aux dernières 24 heures), mais partout où je l'insère, je reçois Low Level Erreur. Est-il possible d'ajouter la clause et si oui, comment? Voici le code sans la clause where:MySQL - Comment insérer une clause where supplémentaire dans cette recherche de texte intégral

 $query = "SELECT *, MATCH (story_title) AGAINST ('$query' IN BOOLEAN MODE) 
AS Relevance FROM stories WHERE MATCH (story_title) AGAINST ('+$query' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 ORDER BY Relevance DESC, story_time DESC; 
+1

Pouvez-vous peut-être ajouter des sauts de ligne là-dedans? C'est difficile à lire comme ça. – Wrikken

+0

Et entre la clause WHERE & HAVING je présume ... – Wrikken

+0

Pouvez-vous préciser où vous essayez d'insérer l'expression 'WHERE' et quelle erreur obtenez-vous? – VeeArr

Répondre

0

On dirait que vous avez deux WHERE clauses là-dedans:

SELECT * 
WHERE story_time > time()-86400 
AND MATCH (story_title) AGAINST ('".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
AS Relevance 
FROM ".$config['db']['pre']."stories 
WHERE MATCH (story_title) AGAINST ('+".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
ORDER BY Relevance DESC, story_time DESC LIMIT 

devrait être quelque chose comme ceci:

SELECT *, MATCH (story_title) AGAINST ('".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
AS Relevance 
FROM ".$config['db']['pre']."stories 
WHERE MATCH (story_title) AGAINST ('+".validate_input($_GET['q'])."' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
AND story_type > time() - 86400 
ORDER BY Relevance DESC, story_time DESC LIMIT 
+0

Non, ne fonctionne pas, mais merci – Steven

5

d'abord, quelques conseils à propos de poser des questions:

  • Utilisez les sauts de ligne. PHP supporte les littéraux de chaînes avec des sauts de ligne, contrairement à certains langages comme Java. Le formatage de votre SQL facilite la lecture, le débogage et la maintenance.

  • Afficher le code SQL. Vous avez intégré l'extension de variable PHP dans cette requête, ce qui n'est pas pertinent pour votre question. Cela rend plus difficile pour les gens de déchiffrer ce que vous essayez de demander. Montrez le code que vous voulez déboguer, pas le code qui génère le code.

maintenant au sujet de votre requête:

  • Vous ne pouvez pas simplement mettre une clause supplémentaire WHERE partout. Ajoutez des termes supplémentaires à votre clause WHERE existante avec l'opérateur AND.

  • L'inclusion d'un appel pour valider le même paramètre $_GET plusieurs fois dans la même requête semble inutile. Utilisez une variable pour conserver le résultat de la validation du paramètre.

  • Profitez de short-circuit evaluation. Mettez les conditions les moins coûteuses à évaluer (par exemple celles qui bénéficient d'un index conventionnel) les plus à gauche.

  • La recherche plein texte dans boolean mode ne retourne pas la pertinence. Vous devez utiliser le natural language mode pour obtenir la valeur de pertinence entre 0 et 1.

  • conditions Mettre dans la clause HAVING au lieu de la clause WHERE le rend plus facile parce que vous pouvez utiliser les alias de colonne que vous avez définis dans la liste SELECT, mais peut rendre la requête pire. HAVING est de placer des conditions sur les groupes à inclure après une clause GROUP BY. WHERE permet de placer des conditions sur les lignes à inclure dans le résultat de la requête. Les lignes sont automatiquement triées par ordre de pertinence si vous utilisez MATCH() en mode langage naturel dans la clause WHERE. Si la probabilité d'un lien est faible, vous pouvez passer votre clause ORDER BY et rendre la requête encore plus efficace.

Voilà comment je voulais écrire ce code:

$q = validate_input($_GET["q"]); 
$bsearch = $pdo->quote("+{$q}"); 
$nlsearch = $pdo->quote($q); 
$stories_table = $config["db"]["pre"] . "stories"; 
$offset = validate_input(($_GET["page"]-1)*10); 

$query = " 
    SELECT *, MATCH (story_title) AGAINST ({$nlsearch}) AS Relevance 
    FROM {$stories_table} 
    WHERE story_time > time()-86400 
    AND MATCH (story_title) AGAINST ({$bsearch} IN BOOLEAN MODE) 
    AND MATCH (story_title) AGAINST ({$nlsearch}) > 0.2 
    LIMIT {$offset}, 10"; 
+2

Pouvez-vous donner plus de détails qui" ne fonctionne pas non plus "? Il est difficile de suggérer quoi que ce soit d'autre. Pouvez-vous éditer votre question ci-dessus et ajouter la requête exacte que vous exécutez (après que tout le code PHP l'ait produit) et le message d'erreur exact? Aussi quelques détails comme quelle version de MySQL et comment vous exécutez la requête de PHP. –

Questions connexes