2017-10-21 28 views
0

J'utilise mysql FULLTEXT Search, moteur de table innodb.
terme de recherche: tomComment utiliser mysql FULLTEXT Recherche avec WHERE dans plusieurs champs en utilisant OU?

SELECT * FROM content WHERE MATCH(title) AGAINST('tom' IN BOOLEAN MODE) AND is_enabled = 1 AND category = 100 OR category = 200 ORDER BY seeders DESC LIMIT 0, 30 

ci-dessus donne requête 550 enregistrements, les enregistrements sont attendus 6

mais si je recherche pour chaque catégorie séparément. recherche dans category 100

SELECT * FROM content WHERE MATCH(title) AGAINST('tom' IN BOOLEAN MODE) AND is_enabled = 1 AND category = 100 ORDER BY seeders DESC LIMIT 0, 30 

donne 5 records

et la recherche dans category 200

SELECT * FROM content WHERE MATCH(title) AGAINST('tom' IN BOOLEAN MODE) AND is_enabled = 1 AND category = 200 ORDER BY seeders DESC LIMIT 0, 30 

donne 1 enregistrement.

donc j'attends des enregistrements 6, en combinant 5 + 1 mais je reçois 550, même les enregistrements qui n'ont pas le mot tom dedans.


Une autre question, est recherche dans category ou sub_category dans la même requête pour mot tom

SELECT * FROM content WHERE MATCH(title) AGAINST('tom' IN BOOLEAN MODE) AND is_enabled = 1 AND sub_category = 101 OR category = 200 ORDER BY seeders DESC LIMIT 0, 30 

donne 550 records. les enregistrements attendus sont 6

alors comment puis-je résoudre ce problème?

Répondre

0

J'ai trouvé une solution. la requête doit être

SELECT * FROM content WHERE MATCH(title) AGAINST('tom' IN BOOLEAN MODE) AND is_enabled = 1 AND (category = 100 OR category = 200) ORDER BY seeders DESC LIMIT 0, 30 

avis, l'opérateur OR est entre parenthèses

et 2e numéro de requête, la recherche dans deux champs en utilisant ou devient

SELECT * FROM content WHERE MATCH(title) AGAINST('tom' IN BOOLEAN MODE) AND is_enabled = 1 AND (sub_category = 101 OR category = 200) ORDER BY seeders DESC LIMIT 0, 30 
bien
+1

, il était en quelque sorte évident que vous a dû appliquer un groupement approprié à vos conditions. Puisque le correctif est si trivial, pourquoi ne pas envisager de supprimer complètement cette question? Il n'a aucune valeur pour les futurs lecteurs dans la mention réelle de recherche en texte intégral car il traite principalement de la capacité à construire des requêtes SQL appropriées. – andrews