MySQL 使用非规范化连接属性连接

MySQL Join with denormalized join attribute

我需要执行数据库连接,不幸的是数据库结构不是第一范式。我无法更改 table structure/layout,因为这是应用程序生成的,我只能创建只读查询来为我自己的统计组件获取数据。

架构如下所示。 table services 包含几个属性,其中特别是属性 property 是相关的。以下是 report table 的示例行:

table: report

id | vehicles | ...
-------------------
1  | 1,2,3    | ...
2  | 2,3      | ...
3  | 2        | ...

vehicle table 看起来像这样:

table: vehicle

vid | description
---------------
1   | Vehicle A
2   | Vehicle B
3   | Vehicle C

我的目标是计算车辆出现在报告中的频率。所需的结果行是:

desired result

description | count(*)
----------------------
Vehicle A   | 1
Vehicle B   | 3
Vehicle C   | 2

对此的伪查询类似于:

SELECT v.description, Count(*)
FROM report r
JOIN vehicles v
ON v.vid IN(r.vehicles)
GROUP BY v.description;

有没有 MySQL 方法在数据库端处理这个问题?还是我必须 select 一切,在应用程序登录中爆炸车辆并在数据库外执行 "join"?

我希望它在数据库端执行此操作。我只能阅读两个 table,但可以在必要时创建视图(如果可能的话,我也想避免)。

我发现 MySQL 支持 FIND_IN_SET 函数,您可以在其中传递要搜索的字符串和要搜索的列表。

因此,有效的查询是:

SELECT v.description as description, COUNT(*) as count
FROM report r
JOIN vehicles v
ON FIND_IN_SET(v.vid, r.vehicles)
GROUP BY (v.description);