9
votes

Plusieurs comme dans SQLite

J'essaie de créer une fonction de recherche.

Si le champ Entrée de recherche est "FOO BAR", je l'ai divisé en deux mots-clés puis faites cette requête: P>

SELECT p.* FROM p_extra_fields as x INNER JOIN products as p ON x.product = p.id
  WHERE x.type = "1"
  AND
  (
     (x.key = "model" AND x.value LIKE "%foo%")
  OR (x.key = "model" AND x.value LIKE "%bar%")
  OR (x.key = "color" AND x.value LIKE "%foo%")
  OR (x.key = "color" AND x.value LIKE "%bar%")
  OR (x.key = "make" AND x.value LIKE "%foo%")
  OR (x.key = "make" AND x.value LIKE "%bar%")
  )      

GROUP BY x.product LIMIT 0, 50


1 commentaires

Après beaucoup de lecture, j'ai pu faire ce dont vous avez besoin sans installer Regexp Imp ou FTS3 et FTS4 Extensions, vérifiez ma solution.


3 Réponses :


4
votes

Je pense que ce où la clause est plus simple: xxx


0 commentaires

6
votes

Si vous avez activé alors vous Peut tirer parti des capacités complètes de recherche de texte (FTS). Vous devrez recréer le p_extra_fields code> sous forme de virtuel code> table. Ensuite, vous pouvez insérer ou code> entre vos termes de recherche et utilisez l'opérateur code> correspondant code>

SELECT p.* 
FROM p_extra_fields x
JOIN products p ON p.id = x.product
WHERE x.key IN ('model', 'color', 'make')
AND x.type = '1'
AND x.value MATCH 'foo OR bar'
GROUP BY x.product LIMIT 0, 50;


3 commentaires

Donc, je dois faire une table virtuelle qui est une copie de mon p_extra_fields table?


Nice, après que certaines recherches ont été capables de le faire sans utiliser Regex et correspondent , cochez ma solution :)


Note importante: comme ("% foo%") cherche des mots contenant 'foo'; Match 'Foo' recherche des mots égaux à "FOO". Autant que je sache, avec FTS, vous ne pouvez pas rechercher de mots contenant un autre mot



0
votes

J'ai eu la même exigence et je cherchais un mécanisme qui serait un match comme Regexp "A | B | C" , ce qui signifie correspondant à a , B , C .

Enfin, c'est la solution que j'ai proposée: xxx

Les critères correspondants sont équivalents à @ Réponse de Gordon: xxx

Mais cela vous donne la possibilité de faire correspondre les valeurs de manière dynamique en fonction de votre paramètre de requête (vous pouvez extraire "foo, bar" Pour être un paramètre).

Par exemple, sans changer votre requête, vous pouvez passer "FOO, BAR, BOO" et JUST correspondance similaire à Regex Match: "FOO | bar | boo "


0 commentaires