如何在mysqli语句中应用regexp

时间:2013-08-31 12:21:21

标签: php html mysql sql

我使用纯PHP而不是任何CMS,如Wordpress。

我有一个产品表,其中有一个产品类别的cat字段。

我有一个基于类别的页面视图。所以,比如我想看看所有带诺基亚品牌的手机。这意味着

SELECT * FROM product_table WHERE cat = nokia.

这适用于产品不属于多类别的情况。如果以下产品的分类如下:Nokia, black, new, expensive, top-rated;然后我需要在我的SQL语句中使用regexp。比如像这样:

SELECT * FROM product WHERE cat *= Nokia.

我的产品表的cat字段是一个字符串,每只猫用逗号分隔

这是对的吗?我该怎么办?

1 个答案:

答案 0 :(得分:1)

你可以明白like条款

SELECT * FROM product_table WHERE cat like '%Nokia%'

如果您愿意,可以使用mysql regex feature

SELECT * FROM product_table WHERE cat REGEXP '.*Nokia.*'

而且,是的,您的数据模型生病了 - 您应该在cat字段中使用1或2个表而不是逗号分隔的字符串。

<强>此外:

SELECT * FROM product_table WHERE (cat like '%Nokia,%' or cat like '%,Nokia%')
ANSI SQL中的

SELECT * FROM product_table WHERE FIND_IN_SET('Nokia',cat)

使用特定于MySQL的功能 - 上面给出的所有4个查询都是无效的,如果不改变数据模型就无法优化。

假设您有两个表products(product_id,product_name,...)categories(cat_id,cat_word,...),您可以通过第三个associative table product_in_categories(product_id,cat_id)

简单地将它们联系起来

使用新数据模型进行有效类别选择查询的示例:

SELECT * FROM products p
WHERE exists(select 1 from categories c, product_in_categories pc 
  where cat_word='Nokia' and c.cat_id=pc.cat_id and pc.product_id=p.product_id)