Mysql非常特殊的相似要求

Mysql非常特殊的相似要求,mysql,sql-like,Mysql,Sql Like,我的情况如下 我在mysql表的“productname”列中有以下记录 现在我想找到以A开头,然后在第一个连字符W之后的记录 如果我写查询如下 select DISTINCT Item_Code, Item_Name from tbl_stock_detail where Item_Name like 'A%-W%' 它给我看了两张唱片。我只想看到这里的第一条记录,因为在A之后,W是连字符之后的第一个字母。类似地,如果我将其设置为“A%-W%-B%”,我希望它只显示第一个记录,如“A”之后,

我的情况如下

我在mysql表的“productname”列中有以下记录

现在我想找到以A开头,然后在第一个连字符W之后的记录

如果我写查询如下

select DISTINCT Item_Code, Item_Name
from tbl_stock_detail
where Item_Name like 'A%-W%'
它给我看了两张唱片。我只想看到这里的第一条记录,因为在A之后,W是连字符之后的第一个字母。类似地,如果我将其设置为“A%-W%-B%”,我希望它只显示第一个记录,如“A”之后,“W”是第一个连字符后面的第一个字母,“B”是第二个连字符后面的第一个字母。请记住,有1000条记录具有各种名称,因此我们无法检查字符串长度

我可以在mysql中编写这样的查询来检查序列吗

对不起,我的正则表达式不好。这在正则表达式中是可能的

请告知

编辑问题如下:

我有一张这样的唱片“长裙红色亮片提克利舞” 现在客户说,他只想根据这3个字符进行搜索, R:红色 T:提克利 S:裙子

还有第二件事。 如果裙子和红色有2个空格而不是1个,我们的旧正则表达式就不起作用了。但这应该是可行的,因为他们有时会在两个单词之间错误地添加多个空格。 你能帮我满足这两个要求吗

更多编辑:

这是静态的,但它给了我一些PHP中的转义序列问题。下面是我的php代码

<?php
$var = 'SRT';
for($i=0;$i<strlen($var);$i++)  
{
    $term = '^'.$var[$i].'|[- ]'.$var[$i];  
    if($i == 0)
        $subquery0 .= " where Item_Name REGEXP '".$term."'";    
    else
        $subquery0 .= " or Item_Name REGEXP '".$term."'";   
}
?>

正如hjpotter92在他的评论中所建议的那样,您应该能够使用正则表达式来定位具有指定匹配项的行

一个像
这样的
谓词不能执行这种类型的匹配。(这需要了解每个组件的最大长度(“成人”、“工作”等),以及一大堆类似谓词和“ed”和“or”加在一起以获得所有可能的长度。我们不想去那里。)

正则表达式没有什么可怕的。正则表达式可能会变得相当复杂,但正是在这一点上,它们显示了它们的威力,变得非常有用


要匹配第一个字符是“A”(大写或小写),后面跟一个连字符,紧接着第一个连字符是“W”,可以执行以下操作:

 WHERE Item_Name REGEXP '^A[^-]*-W'
类似地,从A开始,后跟一个连字符(稍后的某个点),紧接着下一个连字符A“W”,后跟另一个连字符和一个“B”

 WHERE Item_Name REGEXP '^A[^-]*-W[^-]*-B'

让我们一点一点地解开最后一个正则表达式:

^A

第一个插入符号匹配字符串的开头,字符A匹配字符A(注意:在连接到我的数据库时,这是不区分大小写的匹配)。也就是说,“从A或A开始”

[^-]*

此部分匹配任意数量的非连字符字符

-W

此部分匹配紧跟着W的连字符。(由于前面的部分,这将是在先前匹配的a之后出现的第一个连字符。)

[^-]*

同样,非连字符的任意数量的字符(零个或更多)

-B

匹配紧跟在B后面的连字符。同样,这将是匹配的W后面的第一个连字符


字符串的其余部分可以是任何内容。

项_nameregexp'A[^-]+-W.*
应该可以工作。@hjpter92:我认为正则表达式中需要有一个前导插入符号,例如,
'^A'
来匹配字符串的开头,根据规范“记录以A开头”,正则表达式的其余部分看起来很完美。感谢HJPTER92的帮助。将值赋给
$term
变量的代码看起来不错,我无法解释为什么
会回显“$term”仅“显示”前两个字符。如果以HTML或XML形式返回,则可能(?)正在查看它的浏览器正在评估管道和/或方括号。也许可以看看网页的来源?(为了获得更多关于发生了什么的线索,您可以回显字符串的长度
echo strlen($term)
。或者将字符串转换为十六进制,并回显十六进制表示形式。(在SQL注释中,我认为您希望将这些谓词与“and”结合起来,而不是“Or”。)我建议您删去“仅显示前两个字符”下面是一个非常简单的PHP示例,例如,
$term='^S |[-]S';echo$term;
测试它,如果有问题,问另一个问题。(我在PHP沙盒中测试了部分代码,保存在:,输出是我所期望的。我真的非常感谢你。你解释得很好。非常感谢..它为我工作了:)斯宾塞7593如果我想在每个第一个字母前都允许使用“-”或“”(空格),我们怎么能使用它呢?我尝试过了,但没有成功。^A[^-]*-W[^-]*-B'@Vivek:很接近,但是你还需要允许在
W
前面有一个空格或连字符的匹配。只需将
W
前面的连字符替换为
[-]< /代码>,这将允许一个连字符或一个空格的匹配。在<代码> b>代码之前做同样的事情。这样的事情应该起作用:<代码> ^ [^ -] *[[^ -] *[-] b>代码>维韦克:考虑“接受”。回答您提出的问题,让其他StackOverflow用户知道此问题已得到回答。如果您以前的问题已得到回答,您未来的问题可能会得到更多关注。哦,当然。我会这样做。但我的客户使要求更加复杂。您能告诉我如何回答吗?我已编辑了que抱歉,麻烦你了。
 WHERE Item_Name REGEXP '^A[^-]*-W[^-]*-B'