忽略子字符串匹配时具有最高值的列

时间:2018-04-21 14:38:44

标签: mysql sql node.js database

我的应用程序中有一个类似于此的表,我试图忽略项“applefritter_demo_rasberry”,因为它只是具有相同子字符串的所有其他项的总和。

我正在尝试编写一个mysql查询(不是专家)来获取除“applefritter_demo_rasberry”之外的所有值,这些值只不过是这些项目的父项并保留总数。

我使用this post查看了子字符串,但我无法理解这背后的逻辑。有人可以建议一种方式。

Unit

修改

为了给问题增加一点清晰度,该表由一个应用程序填充,该应用程序还插入了父配方的总数及其子项的总数。 我需要确定表中所有配方的总和,该表还包含独立配方(没有父级),例如“ovenfresh_frenchbread”,在总计算期间我要忽略所有这些父项目最终成为子项的子串。

3 个答案:

答案 0 :(得分:1)

据我所知,你想要这样的事情:

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

我不是100%清楚子查询中的匹配逻辑是什么,它是仅基于id还是基于字符串匹配。

答案 1 :(得分:0)

您可以使用 LIKE NOT LIKE 子句按字符序列进行过滤:

  1. LIKE 子句确定字符串是否与指定的模式匹配。模式可以包括普通字符和通配符。
  2. NOT LIKE 反转比较,验证字符串与指定的模式不匹配。
  3. 例如:

    1。选择名称以字母开头的所有人&#39; c&#39;:

    SELECT * FROM person WHERE name LIKE 'c%'
    

    2。选择名称的第二个字母为&#39; c&#39;:

    的所有人
    SELECT * FROM person WHERE name LIKE '_c%'
    

    3。选择所有拥有序列&#39; clau&#39;在名称中独立于他们的位置:

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

    4。选择名称不以字母“c&#39;

    开头的所有人
    SELECT * FROM person WHERE name NOT LIKE 'c%'
    

    您的解决方案

    回到你的问题,如果我们使用NOT LIKE,如下所示,将不会返回任何结果, 因为列中的所有项都以此序列开头:

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

    对于您的问题,解决方案是使用LIKE,如下所示:

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

    希望这有帮助!

答案 2 :(得分:0)

考虑添加另一个包含父级ID的列Parent,与共享ID一样,不清楚哪一行具有哪个角色 - 它是父级还是子级? (也就是说,除了Recipe中的子字符串逻辑之外,它并不能保证完整性,因为在约束条件下使用它很难(如果不是不可能的话)。并且像LIKE这样的字符串操作查询效率较低。或substring()需要参与。另外,共享ID逻辑和子串逻辑同时存在是多余的。如果它们相互矛盾,那么它是正确的吗?)

重新设计,很容易查询父母的直接子女。只需选择Parent是您要查找的所有行,例如:

SELECT *
       FROM table
       WHERE Parent = 164686;

考虑将父母的Value自动填入他们孩子的总和,例如通过触发器,除非你已经这样做了。否则可能会出现不一致。或者仅将值存储在没有任何子节点的行中,并通过其子节点值的总和来计算父节点的值。 (如果涉及多层次的层次结构,这可能会变得毛茸茸。)