我的应用程序中有一个类似于此的表,我试图忽略项“applefritter_demo_rasberry”,因为它只是具有相同子字符串的所有其他项的总和。
我正在尝试编写一个mysql查询(不是专家)来获取除“applefritter_demo_rasberry”之外的所有值,这些值只不过是这些项目的父项并保留总数。
我使用this post查看了子字符串,但我无法理解这背后的逻辑。有人可以建议一种方式。
Unit
修改
为了给问题增加一点清晰度,该表由一个应用程序填充,该应用程序还插入了父配方的总数及其子项的总数。 我需要确定表中所有配方的总和,该表还包含独立配方(没有父级),例如“ovenfresh_frenchbread”,在总计算期间我要忽略所有这些父项目最终成为子项的子串。
答案 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。选择名称以字母开头的所有人&#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
自动填入他们孩子的总和,例如通过触发器,除非你已经这样做了。否则可能会出现不一致。或者仅将值存储在没有任何子节点的行中,并通过其子节点值的总和来计算父节点的值。 (如果涉及多层次的层次结构,这可能会变得毛茸茸。)