使用多个返回的列值作为参数构造多表数据库查询

时间:2017-12-17 20:55:22

标签: mysql database

我正在整理一个系统,使用汽车显示的服务代码提供汽车维修报价。

车辆全部由同一制造商制造,服务代码不是特定于型号的,并指示哪组作业构成服务。 每个工作的价格取决于车辆的型号和安装的发动机类型。

获取必要信息涉及4个表:

  • vrm - 包含车辆详细信息。返回车牌的模型和引擎变体
  • chassis - 每个作业都有一列包含该成本值 工作。每一行都是不同的模型。
  • 引擎 - 与机箱相同,但每行都是不同的引擎。
  • svs_codes - 每个作业都有一列,其值为1或NULL 确定哪些作业适用于该代码。每一行都是不同的 服务代码。

查询需要从牌照中获取引擎和型号,从服务代码返回NOT NULL的作业。然后使用从这些查询返回的值返回引擎和机箱表中这些作业的价格。

我遇到的问题是如何根据svs_codes表中哪些列保留NOT NULL值来仅返回引擎和机箱表中的列?

我开始尝试使用左连接,但我无法获得我想要的结果。我最终向svs_codes添加了SET列,其中包含每个代码的所有相关作业。我创建了一个存储过程,它从这个列中获取值,并CONCAT将它们全部一起创建一个只返回列出列的新查询。

BEGIN
SET @code = (SELECT col FROM svs_codes WHERE code=svsCode);
SET @add = REPLACE(@code, ',' , '+');
SET @car = (SELECT concat(SUBSTR(vin, 4, 3), SUBSTR(engine, 1, 3)) FROM vrm WHERE vrm=regNo);
SET @s = CONCAT('SELECT ', @code, ', (', @add, ') AS total FROM svsview WHERE chassis=', (SELECT SUBSTRING(@car, 1, 3)), ' AND engine=', (SELECT SUBSTRING(@car, 4, 3)), ' LIMIT 1');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

我创建了一个运行存储过程的VIEW。这是机箱和引擎表的JOIN,其中每列的值都加在一起。虽然我的解决方案有效,但看起来有点希思罗宾逊。我是否完全过度复杂,是否有更好的方法?

使用每个表的示例数据进行演示并重新创建我的视图here

0 个答案:

没有答案