MySQL Query:限制子串数的结果

时间:2013-09-16 14:53:12

标签: mysql sql

我有一张这样的表

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

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

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

3 个答案:

答案 0 :(得分:1)

SQL Fiddle

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'

<强> Results

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

编辑:

如果你正在处理短语,它可能看起来像这样:

SQL Fiddle

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',' %')

<强> Results

| ROW ID |        CONTENT |
|--------|----------------|
|  test3 | foo rer ef foo |

答案 1 :(得分:0)

您想要计算列表中foo的数量。这很简单:

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

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

获得此信息后,您可以进行任何您想要的比较。

答案 2 :(得分:0)

遗憾的是,MySQL并没有为你想做的事情提供任何功能。你需要像SUBSTRING_COUNT这样的东西,它不存在。您可以做的是,基于this answer`计算该值。

这样的事可能有用:

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

FROM thetable

HAVING cnt > 0 && cnt < 4;

DEMO:http://sqlfiddle.com/#!2/10599/7