【问题标题】:MySQL Select where field contains one string but not anotherMySQL选择其中字段包含一个字符串但不包含另一个字符串
【发布时间】:2012-11-21 15:06:12
【问题描述】:

我必须为一个产品数据库构建一个搜索查询,该数据库包含两个名称相似的产品,其名称类似于以下示例:

“用于...的小部件模拟器和虚拟研讨会”

“用于...的小部件模拟器”

目前,如果有人搜索“Widget Simulator”,他们会在列表中找到这两种类型的产品。 我正在尝试构建一个类似于“Widget Simulator not:Virtual Seminar”的查询,该查询将省略包含“Virtual Seminar”字样的产品

现有查询如下所示:

SELECT COUNT(*) AS `numrows` 
FROM (`content_product`) 
JOIN `content` ON `content`.`content_id` = `content_product`.`content_id` 
WHERE `content`.`version_status_id` = 28 
AND `content`.`status` = 11
AND `name`  LIKE '%widget%simulator%'

我尝试了以下方法,但它不起作用:

SELECT COUNT(*) AS `numrows` 
FROM (`content_product`) 
JOIN `content` ON `content`.`content_id` = `content_product`.`content_id` 
WHERE `content`.`version_status_id` = 28 
AND `content`.`status` = 11
AND `name`  LIKE '%widget%simulator%'
AND `name` NOT LIKE '%virtual%seminar%'

这不起作用。我想我明白为什么它不起作用,但我在这里或其他地方找不到任何告诉我如何做到这一点的东西。

总而言之,我想显示名称中包含“Widget Simulator”的所有产品,同时省略那些还包含“Virtual Seminar”的产品。

感谢您的任何帮助或建议。

【问题讨论】:

  • 我认为它应该像你写的那样工作。您能否在 sqlfiddle.com 上发布一些示例数据。请参阅我的小提琴以获取简化案例here

标签: mysql search


【解决方案1】:

我认为您应该使用子查询来使用它的个人意见,首先删除所有包含 Virtual Seminar 的产品,然后选择其余包含 Widget Simulator 的产品,如下所示:

SELECT COUNT(*) AS `numrows` 
  FROM (`content_product`) 
  JOIN `content` ON `content`.`content_id` = `content_product`.`content_id` 
 WHERE `content`.`version_status_id` = 28 
   AND `content`.`status` = 11
   AND `name`  LIKE '%widget%simulator%'
   AND `content_product.id` NOT IN (
           SELECT `content_product.id` 
             FROM `content_product` 
            WHERE `name` LIKE '%virtual%seminar%'
       )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2013-11-26
    • 2014-05-25
    • 1970-01-01
    • 2013-03-13
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多