2

我有一个 mySQL 通配符查询不起作用,可能是因为我使用 InnoDB 而不是 MyISAM。

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*)( )*') 

每当使用单词而不是通配符时,它都可以正常工作,这不是问题。

我只是想知道,是

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

已经做了一个之后真的需要

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

有什么不同?

4

1 回答 1

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. 任何字符序列

    与:

    1. 任何字符序列,后跟
    2. 字符序列*donuts*,后跟
    3. 任何字符序列
于 2012-05-03T07:57:21.037 回答