【问题标题】:Query for exact word search查询精确词搜索
【发布时间】:2013-10-07 13:57:59
【问题描述】:

希望你一切都好

我很难写一个查询

这是我的问题解释

我有一个数据库表说“jreviews_content”,其中有一个名为“jr_produits”的字段

在“jr_produits”中,数据的格式是*ryan-decosta*tom-gosling*,所以我想要一个基于精确单词的搜索查询,即如果用户键入“rya”,mysql 不应该返回任何内容 但是如果用户类型 ryan 那么它应该返回该行同样如果用户类型“gos” mysql 不应该返回任何东西 但是如果用户输入 gosling 那么它应该返回 ryan 和 gosling 是确切单词的行

我正在写的查询是

SELECT *
FROM `jreviews_content`
WHERE jr_produits LIKE '%*ryan-%' or jr_produits LIKE '%-ryan*%' 
or jr_produits LIKE '%*ryan*%' or jr_produits LIKE '%-ryan-%';

我希望以其他更有效的方式来完成(通过正则表达式或任何其他方法)

SELECT * FROM `jreviews_content` WHERE jr_produits REGEXP '^[*-]ryan[*-]$'

它不获取任何东西

也没有

SELECT * FROM `jreviews_content` WHERE jr_produits like '%[*-]ryan[*-]%'

请提出建议

【问题讨论】:

  • 更改您的数据库架构,不要尝试在每条记录中创建自定义表!!!

标签: mysql


【解决方案1】:

试试 MySQL 正则表达式单词边界标记。他们记录了大约一半this page

SELECT *
FROM jreviews_content
WHERE jr_produits REGEXP '[[:<:]]ryan[[:>:]]'

请注意,我今天没有 MySQL 访问权限,因此未经测试。

还要注意@user1032531 所说的话。具有 *ryan-decosta*tom-gosling* 之类的值的记录几乎总是意味着“糟糕的设计”。

【讨论】:

  • 你能解释一下你写的正则表达式吗
  • 这不是我的表结构,我正在使用 joomla 的 JReviews 组件,它具有这种结构来存储产品
  • 表结构足够公平,不用担心。至于正则表达式,[[:&lt;:]] 表示“单词的开头”。它与字符不匹配;它说“后面的任何内容(在这种情况下为ryan)必须在单词的开头”。同样,[[:&gt;:]] 表示“单词的结尾”。我的答案中的链接提供了更多细节。希望这可以帮助;我有点难以解释:)
  • 你好,我再次询问我的网站是法语,因此我的网站上有很多口音,例如法语法语我希望搜索不区分重音有什么办法吗那
  • 嗨 Ryan - 我用谷歌搜索了这个,这可能是不可能的。见here。不过,我建议将此作为一个单独的问题发布,因为很多人会看到它,并且有人可能知道解决方法。祝你好运:)
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2018-12-07
  • 2017-10-21
  • 1970-01-01
相关资源
最近更新 更多