忽略子字符串匹配处具有最大值的列

xtupzzrd  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(317)

在我的应用程序中有一个类似的表,我试图忽略“applefritter\u demo\u rasberry”项,因为它只是具有相同子字符串的所有其他项的总和。
我正在尝试编写一个mysql查询(不是Maven)来获取除“applefritter\u demo\u rasberry”之外的所有值,它只不过是这些项的父项并保存总数。
我已经用这篇文章查看了子字符串,但是我不能理解这背后的逻辑。有人能提出一个办法吗。

ID        Recipe                                 Value 
164686    applefritter_demo_rasberry             140                      
164686    applefritter_demo_rasberry_cake        40
164686    applefritter_demo_rasberry_pudding     20
164686    applefritter_demo_rasberry_pie         10
164686    applefritter_demo_rasberry_bread       40
164686    applefritter_demo_rasberry_candy       20
164686    applefritter_demo_rasberry_juice       10

编辑:
只是为了让问题更清楚一点,表中填充了一个应用程序,该应用程序还插入了父菜谱的总菜谱和子菜谱的总菜谱。我需要确定表中所有配方的总数,表中还包含独立配方(无父配方),如“ovenfresh\u frenchbread”,在总计算期间,我希望忽略所有这些父项,它们最终成为子项的子串。

wko9yo5t

wko9yo5t1#

可以使用like和not like子句按字符序列进行筛选:
like子句确定字符串是否与指定的模式匹配。模式可以包括普通字符和通配符。
not like反转比较,验证字符串是否与指定的模式匹配。
例如:
1选择姓名以字母“c”开头的所有人员:

SELECT * FROM person WHERE name LIKE 'c%'

2选择姓名第二个字母为“c”的所有人员:

SELECT * FROM person WHERE name LIKE '_c%'

三。选择姓名中顺序为“clau”且与其职位无关的所有人员:

SELECT * FROM person WHERE name LIKE '%clau%'

4选择姓名不以字母“c”开头的所有人员:

SELECT * FROM person WHERE name NOT LIKE 'c%'

你的解决方案

回到您的问题,如果我们使用如下所示的not like,则不会返回任何结果,因为您列中的所有项都以以下顺序开始:

SELECT * FROM person WHERE name NOT LIKE '%applefritter_demo_rasberry%'

对于您的问题,解决方法如下:

SELECT * FROM person WHERE name LIKE '%applefritter_demo_rasberry_%'

希望这有帮助!

b0zn9rqh

b0zn9rqh2#

据我所知,你想要这样的东西:

select t.*
from t
where t.value <> (select coalesce(sum(t2.value), 0)
                  from t2
                  where t2.recipe like concat(t.recipe, '_%') and
                        t2.id = t.id
                 );

我不完全清楚子查询中的匹配逻辑是什么,它是否只基于 id 或者字符串匹配。

szqfcxe2

szqfcxe23#

考虑添加另一列 Parent 与共享id一样,持有父项的id也不清楚哪一行具有哪一个角色--是父项还是子项(也就是说,除了 Recipe 这对于保证完整性不是很方便,因为在约束中很难(如果不是不可能的话)使用它。像字符串操作那样查询效率较低 LIKE 或者 substring() 需要参与。另外,共享id逻辑和子字符串逻辑同时存在是多余的。如果他们互相矛盾怎么办?)
这样重新设计很容易查询父对象的直接子对象。只需选择 Parent 就是你要找的那个,例如:

SELECT *
       FROM table
       WHERE Parent = 164686;

想一想如何填满 Value 除非你已经这么做了,否则父母会自动地把孩子的总数加起来,比如通过触发器。否则这可能会变得不一致。或者,只将值存储在行中,不包含任何子级,并通过子级的值之和计算父级的值(不过,如果涉及到多个层次结构,这可能会让人毛骨悚然。)

相关问题