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);
我需要执行数据库连接,不幸的是数据库结构不是第一范式。我无法更改 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);