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'
;