MySQL Join 与非规范化连接属性

标签 mysql join database-normalization

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

架构如下所示。有一个表services,它包含几个属性,其中尤其与属性property相关。以下是报告表的示例行:

table: report

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

vehicle 表如下所示:

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 有没有办法在数据库端处理这个问题?或者我是否必须选择所有内容,在应用程序登录中分解车辆并在数据库外部执行“加入”?

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

最佳答案

我发现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);

关于MySQL Join 与非规范化连接属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53556776/

相关文章:

mysql - sphinx 搜索 : joining 3 tables

mysql - 计算 MySQL 中 select 的列

sql - 如何循环遍历数据并将前一批与 SQL Server 中的当前批进行比较?

sql - WHERE ((SELECT COUNT(*) ...) = 0 OR EXISTS (SELECT * FROM ...)) 怎么办?

sql - 标准化超过 700 列的 PostgreSQL 表

数据库 "supertable"与更多表与通用表

php - 用php7.0编写动态调用mysql存储过程的函数

mysql - 在 MySQL 中将日期从基督教转换为佛教

mysql - 为什么重新安装 MySQL 后无法将 NULL 值插入到列中?

mysql - 在数据库中用备注表示选择的理想方式