MySQL 未规范化的 WHERE 子句 table

MySQL WHERE clause on unnormalized table

我想对 table 进行 SELECT 查询以获取产品信息。 table 的一个字段是 "productgroup_ids"。值如下所示:"3||4||13".

这个数据库不是我创建的。

所以我写了一个Rest服务来获取JSON中的内容。现在我想要特定组的产品,例如3 和 4。我得到这样的参数:"3,4"

那么查询应该是这样的:

"SELECT name, description FROM products WHERE productgroup_ids in (3,4);"

但是,我的问题是结果中只有只有 3 或 4 的产品。

是否可以用查询解析字段的值,还是必须读出所有产品,拆分一个"||",比较,如果包含请求的组,则将其添加到数组中?

我假设 || 是数据库中的分隔符,所以

第一件事: 3 和 13 的例子更好,因为这个例子几乎让我找到了一个错误的解决方案,关于这个的信息: (不正确的解决方案)

"SELECT name, description FROM products WHERE '||'+productgroup_ids+'||' like '%||'+replace('3,4',',','||')+'||%'

但显然,这不适用于 3 和 13

那么现在呢。显而易见的答案是没有简单的方法。 解决方案是: 1) 将 JSON 字符串拆分为临时 table 2) 用 join

做一个 select

要将字符串拆分为临时 table 看一下: MySQL Split Comma Separated String Into Temp Table

让我们假设温度。 table 名为 TempJSONCategory 只有一列名为 category。 然后像这样做 select:

SELECT name, description 
  FROM products 
 WHERE products_primary_key in
       (select products_primary_key 
          from products
          join TempJSONCategory 
            on '||'+products.productgroup_ids+'||' like '%||'+TempJSONCategory.category+'||%')

太棒了。而已。是的,它不是很漂亮,但相当快。但这就是糟糕的数据库设计的代价:-/

编辑:不得不编辑,select有点错误:

由于数据量较小(不超过50个数据集),我现在选择所有产品,将字段与组拆分,并通过参数进行检查。

现在可以了。但这仍然是一个糟糕的解决方案。