【问题标题】:selecting matches according to the char length of the strings in rows根据行中字符串的字符长度选择匹配项
【发布时间】:2015-09-21 20:43:02
【问题描述】:

我有 2 个 SELECT 语句,假设它是为了使所需的匹配数直接对应于“输入”列的 char_length。所以,例如:

if (char_length(input) <= 5) { matches required is 1 }
if (char_length(input) > 5 && char_length(input) <= 10) { matches required is 2 }
if (char_length(input) > 10 && char_length(input) <= 15) { matches required is 3 }

and ect...  

然而,事实并非如此。只要存在匹配项,它就会选择该行,无论字符串中字符的长度如何。这是我的代码:

SELECT @limit :=0;
SELECT input, response, (
input LIKE  '% one %'
) AS matches, @limit := @limit +1
FROM allData
WHERE @limit < CEIL( CHAR_LENGTH( input ) /5 ) 
HAVING matches >0
AND matches = ( 
SELECT MAX( (
input LIKE  '% one %'
) ) 
FROM allData ) 
LIMIT 30 ;

例如:

列:输入:示例行 "what superpower would you have for one day"

^---只有在有 8 个匹配项时才会被选中,因为 42/5 = 8.4。

42 是上面字符串的字符长度。如果有 8 个匹配项,则应该只从那里选择。但是,只有 1 个匹配项 - 单词“one”,但无论如何它还是被选中了。我不确定我做错了什么。请看一下我的代码。

被标记为重复。它不是重复的。我从那里得到了不起作用的答案。

【问题讨论】:

  • @barmar 这就是我得到答案的地方......它不起作用。这就是我重新发布它的原因。
  • 你为什么不告诉发布答案的人它不起作用,然后在那里解决它?
  • @Barmar 你有 200k 代表。你当然可以回答。你不能吗?
  • 我也许可以,但我还没想太多。
  • @Barmar 你愿意吗?请问?

标签: php mysql regex database


【解决方案1】:

MySQL 没有内置函数来计算列中字符串的出现次数。解决方法是公式:

(CHAR_LENGTH(column) - CHAR_LENGTH(replace(column, @string, '')))/CHAR_LENGTH(@string)

replace(column, @string, '')) 返回删除所有出现的@string 的列值。当您从整个列的长度中减去该长度时,您将得到字符串所有重复项的长度。将其除以字符串的长度会得出出现次数。所以你的查询应该是:

SELECT input, response, (CHAR_LENGTH(input) - CHAR_LENGTH(replace(input, 'one', '')))/CHAR_LENGTH('one') AS matches
FROM allData
HAVING matches >= CEIL(CHAR_LENGTH(input)/5)

DEMO

【讨论】:

  • 不是“一”,而是“一”吗?在单词“one”的左侧和右侧有空格,以便它可以匹配确定它是一个新单词,而不是它作为另一个单词的一部分?
  • 因此,例如,如果该行包含类似“xonex”的内容,它也会返回它。我只希望它返回类似于“x one x”之类的东西,“one”的左右两边都有空格。
  • 如果它包含“一个”怎么办?第一个单词的左边没有空格,第二个单词的右边没有空格。您可以使用正则表达式来匹配它,但在 MySQL 中无法计算它们。
  • 这就是为什么我的数据库中从来没有任何带有“one one”的行。在将字符串插入数据库之前,我总是在字符串的左侧和右侧添加一个空格,所以它是“一个”。这就是为什么没有理由担心这一点。您对我的问题有解决方案,还是想不出办法?
  • 我想不出任何仅在 SQL 中执行此操作的方法。您需要一个计算出现次数的存储过程,或者使用客户端语言来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2022-11-03
  • 2016-11-16
  • 1970-01-01
  • 2021-09-08
相关资源
最近更新 更多