2012-03-10 90 views
3

我有一个wordpress插件,实质上创建一个mysql查询并将结果返回给wordpress。mysql多个或不喜欢

它是用户驱动的,因此可能会导致查询速度非常缓慢,最终导致多个NOT LIKE的大型查询。

,我可以用它来提高任何建议:

SELECT field1,field2,field3,field4 
from datatable 
WHERE (title NOT LIKE '%word%' AND title NOT LIKE '%word2%' 
AND title NOT LIKE '%word3%' AND title NOT LIKE '%word4%' 
AND title NOT LIKE '%word5%' AND title NOT LIKE '%word6%' 
AND title NOT LIKE '%word7%' AND title NOT LIKE '%word8%' 
AND title NOT LIKE '%word9%') 
AND MATCH (title) AGAINST ("\"brandname\" " IN BOOLEAN MODE) 
ORDER BY total ASC LIMIT 0,60 

的客户增添了不少负面关键字到WordPress插件导致比上面的一个较大的疑问。

回答

4

这是最容易做REGEXP。对于多个单词,使用一组像(one|two|three)

SELECT 
    field1, 
    field2, 
    field3, 
    field4 
from datatable 
WHERE 
    title NOT REGEXP '(word1|word2|word3|word4|word5...|word9)' 
    AND MATCH (title) AGAINST ("\"brandname\" " IN BOOLEAN MODE) 
ORDER BY total ASC 
LIMIT 0,60 
+0

优秀,我会试一试,你认为这会提高查询速度吗? – bertster 2012-03-10 12:38:21

+0

@ user1237700它可能会加快一点,只有知道的方法是测试它并对其进行基准测试。 – 2012-03-10 12:39:30

1

您可以使用REGEXP操作一次比较所有模式。

您的查询将是这样的:

SELECT field1,field2,field3,field4 
    FROM data table 
WHERE title NOT REGEXP '^word[0-9]?$' 
    AND MATCH(title) ("\"brandname\" " IN BOOLEAN MODE) 
ORDER BY total ASC LIMIT 0,60 
+0

感谢巴勃罗,我会怎么做,与多个单词吗? – bertster 2012-03-10 12:35:51

+0

这就是你所需要的一切。尝试查询。正则表达式将匹配“word”,“word1”,“word2”,“word3”,“word4”,“word5”,“word6”,“word7”,“word8”和“word9” – 2012-03-10 12:41:21

+0

对不起! word&word1&word2实际上并不像它们可以是用户输入的任何内容。我认为迈克尔在word1 |上面解释了它word2 |等等|分隔符 – bertster 2012-03-10 12:45:19