2009-08-08 4 views
0

J'essaie d'écrire une recherche personnalisée qui va chercher "toutes les catégories" et les catégories individuelles (via un formulaire/sélectionner une liste déroulante). J'ai des problèmes avec ma recherche de catégorie individuelle. Quand je teste mon sql, il renvoie de bons résultats, mais j'obtiens des catégories supplémentaires/indésirables dans mes résultats. Je reçois ces catégories supplémentaires dans mes résultats en raison de mes clauses AND et OR. Par exemple, dans ma requête de test pour "vector", j'obtiens des résultats de 3 catégories car le mot "vector" apparaît dans les titres, les descriptions ou les tags dans 3 catégories distinctes. Ce que je veux faire est de restreindre cela à ne montrer que la section appropriée (qui est choisie dans la liste déroulante formulaire/sélection). Ainsi, par exemple, je reçois des résultats des catégories 8, 12 et 13, mais je veux seulement montrer la catégorie 8 (parce que c'est ce que je choisis dans mon formulaire/liste déroulante - c'est ma clause WHERE ci-dessous). Mes résultats sont tout à fait logiques, mais je ne sais pas comment ne montrer que les résultats de la catégorie 8 (dans mon exemple de test). Je veux essentiellement à faire un peu de filtrage supplémentaire pour réduire le jeu de résultats à seule catégorie 8.SQL (pour mysql) obtenir de bons résultats, mais besoin d'exclure certaines colonnes

SELECT title,category 
FROM stories 
WHERE category=8 
AND title LIKE '%vector%' 
OR desc LIKE '%vector%' OR tags LIKE '%vector%' 
ORDER BY time DESC 

Répondre

3

Vous avez un petit problème avec votre priorité de l'opérateur. AND a une priorité plus élevée que OR, de sorte que votre requête est actuellement analysée comme telle:

SELECT title,category 
FROM stories 
WHERE (category=8 AND title LIKE '%vector%') 
OR desc LIKE '%vector%' OR tags LIKE '%vector%' 
ORDER BY time DESC 

Qu'est-ce que vous voulez vraiment est cette requête:

SELECT title,category 
FROM stories 
WHERE category=8 
AND 
(title LIKE '%vector%' OR desc LIKE '%vector%' OR tags LIKE '%vector%') 
ORDER BY time DESC 

Plus d'informations sur la priorité des opérateurs est MySQL est disponible dans le documentation:

11.2.1: Operator Precedence

+0

Merci, ça semble fonctionner beaucoup mieux maintenant!Je vois que d'autres ont fait le même effet, mais en marquant cela comme la réponse à cause de la mention de l'erreur de préséance et du lien. Merci beaucoup à tous. –

0

Je peux me tromper, mais en fonction de la liste des colonnes du bit SELECT de la requête, la colonne de catégorie est appelée category , mais dans la clause WHERE, il s'agit de cat. Devraient-ils tous les deux être category? En tant que sidenote, si vous savez que la catégorie est 8, pourquoi devez-vous sélectionner cela dans la base de données?

Mais plus important encore, vous devriez parenthésée votre logique dans la clause WHERE, probablement quelque chose comme:

WHERE 
    category=8 
    AND (
     title LIKE '%vector%' OR 
     desc LIKE '%vector%' OR 
     tags LIKE '%vector%' 
    ) 

De cette façon, la catégorie sera toujours faire partie de la requête, mais une seule du titre/Les bits desc/tags doivent correspondre.

+0

Ouais, la catégorie doit correspondre, c'est mon mal avec des trucs copier/coller/modifier dehors pour faire sql aussi minimes que possible de sorte qu'il est plus facile pour les gens à regarder, je vais modifier que momentanément ..... La catégorie sera dynamique, c'est juste 8 dans mes tests. Il est basé sur un formulaire select/dropdown donc il pourrait être 8 ou 3 ou 5 ou 12 ou n'importe quelle catégorie est sélectionnée. –

1

juste ajouter entre parenthèses, selon le cas:

SELECT title,category 
FROM stories 
WHERE category=8 
AND (title LIKE '%vector%' 
OR desc LIKE '%vector%' OR tags LIKE '%vector%') 
ORDER BY time DESC 
0

Supports manquants?

Essayez

SELECT title,category 
FROM stories 
WHERE category=8 
AND (title LIKE '%vector%' 
OR desc LIKE '%vector%' OR tags LIKE '%vector%') 
ORDER BY time DESC 
Questions connexes