我有以下类别: 主要类别(猫):
Sub Cat示例:
对于主猫1:
对于主猫2:
对于主猫15:
我想为MYSQL找到一个正则表达式,以查找以某个类别开头的类别。
例如(上面的例子):
查找类别以 1 开头 应该返回:
如果我做正则表达式,我会得到:
查找类别以 1.1 开头 应该返回:
如果我做正则表达式,我会得到:
查找类别以 2.1 开头 应该返回:
如果我做正则表达式,我会得到:
谢谢您的帮助:)
答案 0 :(得分:0)
我认为您根本不需要正则表达式,并且可能会使它复杂化。
如果您知道要查找的类别,并假设用户正在请求“ 1.1”部分或“ 1.2”或“ 1.4.1”部分,则可以使用通配符进行搜索。
您没有提及此数据是以小数还是varchar的形式存储,所以我猜它是varchar的原因,只是因为在大多数数据库中,我从未见过它们总是以这种形式存储。
因此,如果类别为1.1,并且您想要1.1.0、1.1.1、1.1.12等,则将只搜索与1.1。%匹配的内容,这意味着将搜索1.1后跟点而不是点的任何内容。直接跟一个数字。
查询示例:
$category = "1.1";
$sql = "SELECT * FROM [your_table] WHERE cat LIKE '".$category.".%'";
此查询将匹配:
1.1.0
1.1.1
1.1.15
// Any anything else starting with 1.1.
答案 1 :(得分:0)
对于8.0.4之前的MySQL,您可以在正则表达式中使用单词边界标记([[:>:]]
)的结尾,以避免选择以.g开头的子类别。搜索2.12
时使用2.1
。尝试这样的事情:
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1[[:>:]]'
对于MySQL 8.0.4和更高版本,它支持\b
作为单词边界,您可以改用它(请注意,由于MySQL将其解释为转义字符,因此需要复制\
字符串):
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1\\b'
答案 2 :(得分:0)
对于主类别1:LIKE '1.%'
对于主类别15:LIKE '15.%'
对于类别2.1:LIKE '2.1.%'
此外,通过使用LIKE
,您可以使用INDEX(cat)
来提高性能。
但是... 这可能还不够。 (并且我声称这里的问题是模棱两可的。)如果可能只有'2.1'
(没有子猫)的条目,那么这些LIKE就是不够的。所以...
方案A:col REGEXP '^2[.]1([.]|$)'
-但是REGEXP
将不使用任何索引。
方案B:col = '2.1' OR col LIKE '2.1.%' -- But
OR`禁止使用索引。
计划C:笨拙,但对于大型数据集而言最快(由于索引):
WHERE col LIKE '2.1%' -- uses INDEX(col) for quick filtering
AND col REGEXP '^2[.]1([.]|$)' -- avoids "2.15" and other things
为什么.
周围有括号?:
.
本身可以匹配任意一个字符-不需要[.]
与任何字符集匹配,包括一个句点\.
匹配一个句点,但是根据上下文,您可能需要1个,2个或4个反斜杠。底线:为简单起见,请使用计划B。对于性能,请使用计划C。