是否可以引用另一列来创建“组合”查询?

Posted

技术标签:

【中文标题】是否可以引用另一列来创建“组合”查询?【英文标题】:Is it possible to reference another column to create a 'combinatorial' query? 【发布时间】:2020-10-01 17:20:03 【问题描述】:

假设我有一个包含这些列的表:

| id | mass | sequence | A | M | C |
  0    100    AMMA       2   2   0
  1    200    MMMC       1   3   1

我有兴趣查询大众“220”。当然,这些条目都不会注册为命中,因为它们 100 =/= 220 和 200 =/= 220。

但我想说明字符串中的每个“M”都可以将“10”添加到质量值的可能性,因此对于第一个条目,我希望它也注册质量 110、120。对于第二个条目,我要它注册群众210、220、230。

类似的东西:

SELECT *
FROM myTable
WHERE mass IN (mass, mass + M*10);

这个查询是不够的,因为它只考虑了所有 M 加 10 的情况。我想考虑每个 M 加或不加 10。

我应该注意,匹配必须非常精确(在 1 的错误窗口内)。所以 225 不应该注册为命中,只是:

209 < x < 211
219 < x < 221
229 < x < 231

这可以通过查询实现吗?

【问题讨论】:

【参考方案1】:

这是你想要的吗?

where 220 between mass and mass + m * 10

你也可以这样表述:

where 220 - mass between 0 and m * 10

如果您想要完全匹配,则可以使用递归查询(这需要 mysql 8.0):

with cte as (
    select id, mass, m from mytable
    union all
    select id, mass, m - 1 from cte where m > 0
)
select * from cte where mass + m * 10 = 220

如果您想允许1 的容差,那么只需更改最终查询:

with cte as (...)
select * from cte where mass + m * 10 - 220 between -1 and 1

【讨论】:

不幸的是,匹配必须非常精确(在 ~1 的错误窗口内)。所以我不希望 225 注册为命中。只有 200、210、220、230。我更新了我的问题 - 感谢您指出这一点 我想这就是我需要的。我会接受你的回答!我是一个大的 MySQL 菜鸟,所以这让我很头疼,所以我需要对此进行一些阅读。您是否有机会解释递归“公用表表达式”的工作原理? dev.mysql.com/doc/refman/8.0/en/… @Vranvs:CTE 中的第一个查询选择表中的所有行。然后,递归部分(在union all 之后)生成新行,其中m 逐渐减少,直到达到0 我想我明白了。这实际上并不能解决我的确切问题,但没关系!这使我走上了正确的轨道,以了解我需要做什么。谢谢!! @Vranvs:我编辑显示如何设置 +/-1 容差。

以上是关于是否可以引用另一列来创建“组合”查询?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用另一列来显示 LONGTEXT 是不是包含数据? [关闭]

通过迭代另一列来创建一列

根据另一列 SQL 动态生成一列的数据组合

如何将一列的列值组合到 MySQL 中的另一列中?

如何使用pyspark将两列值组合到另一列?

批处理文件:将两列的字符串组合到另一列中