2009-06-22 3 views
4

Ich habe eine MySQL-AbfrageMySQL Search Refinement (Ersetzen lange regex mit subquery)

select query from HR_Health_Logs where query REGEXP 'CPU|MAC|PC|abacus|calculator|laptop|mainframe|microcomputer|minicomputer|machine'; 

Abgesehen davon, dass die Regex viel länger ist, und viele Synonyme und Tippfehler enthält.

Ich muss dies kurz und haben eine Tabelle mit allen Synonymen und Rechtschreibfehler, so dass ich diese sehr lange Abfrage vermeiden kann. So freue ich mich für so etwas wie

select query from HR_Health_Logs where query REGEXP '**HAVE A TABLE WITH ALL MY SYNONYMS AND MISSPELLINGS SEARCHED HERE**'; 

Antwort

1
SELECT query 
FROM HR_Health_Logs l, synonym s 
WHERE l.query = s.synonym 
3

Wie über die ANY function?

select query from HR_Health_Logs where query REGEXP ANY (SELECT spell FROM misspelled WHERE correct = 'masturbate') ; 
+0

habe ein Problem damit> warum kommt das? WHERE correct = 'masturbieren', im Grunde jedes Wort [syn + misp] sind alle korrekt - so muss ich nur alle durchlaufen –

+0

Meine Abfrage wurde speziell entwickelt, um alle HR_Health_Logs.query zu suchen, die 'Masturbation' Synonyme, weil ich (falsch) dachte, das war dein Bedürfnis. Jetzt, wenn Sie nur alle Übereinstimmungen aller Synonyme wollen, entfernen Sie einfach die WHERE-Klausel in der Unterabfrage ... Auch ich nannte es falsch geschrieben, aber das könnte Synonyme sein. –

+0

Jst a Quick one> Welche Engine verwenden Sie, um dies zu testen? –

0
SELECT query 
FROM HR_Health_Logs 
WHERE query IN (
    SELECT synonym AS query 
    FROM synonyms_table 
    WHERE word = 'masturbation' 
    UNION 
    SELECT misspelling AS query 
    FROM misspellings_table 
    WHERE word = 'masturbation' 
) 

Unter der Annahme, sind Ihre Synonyme und Tippfehler in zwei separaten Tabellen. Andernfalls verwenden Sie nur eine der Unterabfragen und löschen die UNION.