2012-05-03 30 views
2

我有一个mySQL通配符查询不起作用,可能是因为我使用InnoDB而不是MyISAM。LIKE和REGEXP有什么区别?

SELECT a.product_id, a.category_id FROM products a 
LEFT JOIN users u ON u.userid=a.ownerid 
WHERE a.active=1 AND a.approved=1 
AND a.deleted=0 AND a.name LIKE '%*my*%' 
AND a.name LIKE '%*donuts*%' 
AND (a.name REGEXP '()*(*my*)*()*(*donuts*)()*') 

无论何时使用单词而不是通配符,它​​都可以正常工作,但这不是问题。

我只是想知道,是真正需要的已经做了

LIKE '%*my*%' AND a.name LIKE '%*donuts*%' 

有什么区别后

(a.name REGEXP '()*(*my*)*()*(*donuts*)()*') 

的一部分吗?

+3

''()*(* my *)*()*(* donuts *)()*'' - 这是非常奇怪的正则表达式。我敢打赌,这个表达式的作者不知道如何编写正则表达式 – zerkms

+1

“我有一个不能正常工作的mySQL通配符查询,因为我使用的是InnoDB而不是MyISAM。” ---不,它不起作用,因为'LIKE'和'REGEX'表达式组成不正确 – zerkms

+0

你可能会更好地告诉我们你的目标(例如你在找什么)并询问如何做到这一点,因为我不太清楚上面是否有你认为它的作用... – Nanne

回答

4

有什么区别?

  • 正则表达式

    (a.name REGEXP '()*(*my*)*()*(*donuts*)()*') 
    

    这之后立即产生一个错误,因为一个量词(例如未转义*字符)是无效的,在一个组的开始(即未转义的(字符)。忽略了两次,其中发生产量:

    (a.name REGEXP '()*(my*)*()*(donuts*)()*') 
    

    此任何a.name与匹配:

    1. 零或多个空格,随后
    2. 零个或多个的:

      • 字母m,后面跟着
      • 零个或多个字母y

      随后

    3. 零或多个空格,随后
    4. 字符序列donut,随后
    5. 零或多个字母s,随后
    6. 零或更多空间

     

  • 简单图案

    a.name LIKE '%*my*%' AND a.name LIKE '%*donuts*%' 
    

    这个匹配a.name用:

    1. 任何字符序列,随后
    2. 字符序列*my*,随后
    3. 任何字符序列

    用:

  • 任何字符序列,随后
  • 字符序列*donuts*,随后
  • 任何字符序列
+0

这是非常详细的,非常有意义,谢谢:) – user1227914