1

我有一张这样的桌子

ROW ID         |   CONTENT
------------------------------------------------
test1          |   foo, foo, foo
test2          |   bar, bar
test3          |   foo, foo
test4          |   foo, foo, foo, foo

我想要实现的是查询,它给了我行但限制它尊重子字符串的出现。

一些例子可能是:

  • 将结果限制为 3 次“foo”出现 -> 应返回 test1
  • 将结果限制为 4 次“foo”出现 -> 应返回 test1 和 test3
  • 将结果限制为 100 次“foo”-> 应返回 test1、test3、test4
  • 将结果限制为 7 次“foo”出现 -> 还应返回 test1、test3、test4

有没有办法做到这一点?提前致谢!

PS:我应该提到','可以是没有可预测长度的任何字符串。

4

3 回答 3

1

SQL小提琴

MySQL 5.5.32 架构设置

CREATE TABLE Table1
    (`ROW ID` varchar(5), `CONTENT` varchar(18))
;

INSERT INTO Table1
    (`ROW ID`, `CONTENT`)
VALUES
    ('test1', 'foo, foo, foo'),
    ('test2', 'bar, bar'),
    ('test3', 'foo, foo'),
    ('test4', 'foo, foo, foo, foo')
;

查询 1

SELECT *
FROM Table1
WHERE ((LENGTH(CONTENT) - 
        LENGTH(REPLACE(CONTENT, ',', ''))) + 1) < 3
     AND SUBSTRING(CONTENT,1,LENGTH('FOO')) = 'FOO'

结果

| ROW ID |  CONTENT |
|--------|----------|
|  test3 | foo, foo |

编辑 :

如果您正在处理短语,它可能如下所示:

SQL小提琴

MySQL 5.5.32 架构设置

CREATE TABLE Table1
    (`ROW ID` varchar(5), `CONTENT` varchar(48))
;

INSERT INTO Table1
    (`ROW ID`, `CONTENT`)
VALUES
    ('test1', 'foo de foo refe foo'),
    ('test2', 'bar re bar'),
    ('test3', 'foo rer ef foo'),
    ('test4', 'foo rer foo fsdfs foo dfsfe foo')
;

查询 1

SELECT *
FROM Table1
WHERE (LENGTH(CONCAT(' ',CONTENT,' ')) - 
       LENGTH(REPLACE(CONCAT(' ',UPPER(CONTENT),' '), 
                      CONCAT(' ','FOO',' '), '')))
       /(LENGTH('FOO')+2) < 3 AND
       CONCAT(' ',CONTENT,' ') LIKE CONCAT('% ','FOO',' %')

结果

| ROW ID |        CONTENT |
|--------|----------------|
|  test3 | foo rer ef foo |
于 2013-09-16T15:08:35.760 回答
0

您想计算foo列表中 s 的数量。这很容易:

select t.*
from t
where (char_length(concat(', ', content, ', ')) -
       char_length(replace(concat(', ', content, ', '), ', foo, ', '1234567'))
      ) = 3;

这个想法是'foo'用少一个字符的东西替换。但是,您可能需要小心使用'foobars'and'barfood'和其他可能导致误报的字符串。所以,这个版本只是将分隔符放在字符串的开头和结尾。

一旦你有了这些信息,你就可以做任何你想做的比较。

于 2013-09-16T15:04:30.767 回答
0

不幸的是,MySQL 没有任何内置功能可以满足您的需求。你需要类似的东西SUBSTRING_COUNT,但它不存在。您可以做的是,根据这个答案`计算该值。

像这样的东西可能会起作用:

SELECT rowid,
(LENGTH(content) - LENGTH(REPLACE(content, 'foo', ''))) / LENGTH('foo') AS cnt

FROM thetable

HAVING cnt > 0 && cnt < 4;

演示:http ://sqlfiddle.com/#!2/10599/7

于 2013-09-16T15:04:52.770 回答