MYSQL-无序文本的搜索字段

MYSQL-无序文本的搜索字段,mysql,Mysql,我在尝试查询以下数据时遇到问题: id. | name | type 1. bob | a 2. sam | ab 3. jim | abc 4. sarah | ad 5. john | a 6. eve | bca 7. nikki | ca 我正在尝试基于以下输入编写MySQL查询: a, ac, b*, ac* 我想返回以下名称: bob john sam jim eve nikki 细分: a = bob, john ac =

我在尝试查询以下数据时遇到问题:

id. | name | type

 1.    bob | a 
 2.    sam | ab
 3.    jim | abc
 4.  sarah | ad
 5.   john | a
 6.    eve | bca
 7.  nikki | ca
我正在尝试基于以下输入编写MySQL查询:

a,
ac,
b*,
ac*
我想返回以下名称:

bob
john
sam
jim
eve
nikki
细分:

a  = bob, john
ac = nikki  
b* = sam, jim, eve
ac*= jim, eve, nikki
解释:

a  = find results that are JUST a
ac = find results that contain ONLY an a AND c
b* = find results which contains a b
ac*  find results that contain at least an a and a c
可以看出,“类型”列可以包含不同顺序的类型信息(并不总是递增)

我确信这可以通过将type列拆分为
type\u a
type\u b
等来实现,然后在每个列中都有一个
bool
。但这可能会上升到
z
,我不想在我的桌子上多放26匹可乐

这是否可以在一个单一的查询,如果是任何帮助将不胜感激

很抱歉我不知道该怎么称呼它

-- ac*, ac, a, b*

SELECT  *
FROM    mytable
WHERE   (
        type RLIKE 'a'
        AND type RLIKE 'c'
        )
        OR
        (
        type RLIKE 'a'
        AND type RLIKE 'c'
        AND NOT type RLIKE '[^ac]'
        )
        OR
        (
        type RLIKE 'a'
        AND NOT type RLIKE '[^a]'
        )
        OR
        (
        type RLIKE 'b'
        );
但这不会使用任何索引

如果您的表是
MyISAM
,则可以存储以下类型:

id   name     type
7    nikki    a c
(注意空格)并使用
全文
功能:

CREATE FULLTEXT INDEX fx_mytable_type ON mytable (type);

-- ac*
SELECT  *
FROM    mytable
WHERE   MATCH(type) AGAINST '+"a" + "c"' IN BOOLEAN MODE);


-- ac
SELECT  *
FROM    mytable
WHERE   MATCH(type) AGAINST '+"a" + "c"' IN BOOLEAN MODE);
        AND NOT TYPE RLIKE '[^ ac]' -- note the space
设置
@@ft\u min\u word\u len=1
使其工作。

您可以使用:


为什么
ac
ac*
返回
nikki
?因为nikki包含一个ac。所以她在just ac部分和ac*(为了澄清ac*是指任何带有a或c和/或任何其他字母
nikki
的东西都不包含
ac
,只是一个
c
。应该
ac*
匹配
a和С(可能还有其他人)
a或c(可能还有其他人)
?我很抱歉我错过了nikki的c。她应该是“ca”ca*应该是a和c以及其他我怀疑你的数据库结构(因此这个查询)可以通过以下方式简化:
类型
列应该替换为
类型
表,该表由
(用户id,类型)组成
pairs?非常感谢您将尝试此方法。虽然这可以在一次调用中执行多个查询吗?还是我最好将每个查询作为自己的查询,然后从结果中删除重复项?詹姆斯:哪些重复项?每个搜索字符串转换为一个查询。如果我运行3个查询,我将得到3组结果,其中ay包含重复的结果(因为一些名称将匹配多个查询)谢谢!我将以编程方式构建查询(基本上只是传递一个数组(“ab”、“ac”、“b”、“ab*”)因此,我将尝试您的方法和@eggyal方法,看看哪种方法更容易生成查询generate@james:类似于
'abcdef'
的字符串将要求您使用
720
(720)生成一个regexp置换。第二个谓词要匹配什么?第二个谓词将只匹配
a
c
或空字符串。@Quassnoi:字符类
[ac]
重复(它以前使用
*
,现在使用
+
)。虽然我没有考虑空字符串,但现在已更正。谢谢。我想说的是@op的意图不是只匹配字符串,比如说,
'c'
。您的查询现在是匹配的。我回来时遇到了相同的问题,想看一个解决方案;做得很好!尽管是一个快速的问题……如果我想要怎么办做cba*还是cba?
SELECT name FROM your_table WHERE
     type RLIKE '^a+$'                            -- only 'a'
  OR type RLIKE '^((a[ac]*c)|(c[ac]*a))[ac]*$'    -- only & both 'a' AND 'c'
  OR type RLIKE 'b'                               -- at least one 'b'
  OR type RLIKE '(a.*c)|(c.*a)'                   -- at least 'a' and 'c'
;