mysql - 计算 SQL 查询中的多对多关系表参考 - 应用制作工具
问题描述
我有两个表,即 WaterUseData 和 PermitList,它们具有多对多关系,在默认数据库中名为“WaterUseDataPermits - RelatedPermits”的表中捕获。我正在针对 WaterUseData 表运行计算的 sql 数据源,其中 RelatedPermits 键等于我从客户端传递的 Permit 键类型的参数。相关查询如下:
SELECT
YEAR(Date + INTERVAL 3 MONTH) AS WaterYear,
SUM(IF(DATE_FORMAT(Date,'%m') = '10',Water_Use_Gallons,null)) as 'Oct',
SUM(IF(DATE_FORMAT(Date,'%m') = '11',Water_Use_Gallons,null)) as 'Nov',
SUM(IF(DATE_FORMAT(Date,'%m') = '12',Water_Use_Gallons,null)) as 'Dec',
SUM(IF(DATE_FORMAT(Date,'%m') = '01',Water_Use_Gallons,null)) as 'Jan',
SUM(IF(DATE_FORMAT(Date,'%m') = '02',Water_Use_Gallons,null)) as 'Feb',
SUM(IF(DATE_FORMAT(Date,'%m') = '03',Water_Use_Gallons,null)) as 'Mar',
SUM(IF(DATE_FORMAT(Date,'%m') = '04',Water_Use_Gallons,null)) as 'Apr',
SUM(IF(DATE_FORMAT(Date,'%m') = '05',Water_Use_Gallons,null)) as 'May',
SUM(IF(DATE_FORMAT(Date,'%m') = '06',Water_Use_Gallons,null)) as 'Jun',
SUM(IF(DATE_FORMAT(Date,'%m') = '07',Water_Use_Gallons,null)) as 'Jul',
SUM(IF(DATE_FORMAT(Date,'%m') = '08',Water_Use_Gallons,null)) as 'Aug',
SUM(IF(DATE_FORMAT(Date,'%m') = '09',Water_Use_Gallons,null)) as 'Sep',
SUM(Water_Use_Gallons) as Total
FROM WaterUseData
WHERE [WaterUseDataPermits - RelatedPermits].RelatedPermits = :PermitKey
GROUP BY YEAR(Date + INTERVAL 3 MONTH)
ORDER BY YEAR(Date + INTERVAL 3 MONTH) ASC
除了 [WaterUseDataPermits - RelatedPermits] 试图引用包含关系键的表之外,我还尝试了“WaterUseDataPermits - RelatedPermits”、“WaterUseDataPermits - RelatedPermits”、“WaterUseDataPermits - RelatedPermits ”、['WaterUseDataPermits - RelatedPermits']、[” WaterUseDataPermits - RelatedPermits"] 和 WaterUseDataPermits_RelatedPermits。所有这些都导致 SQL 语法错误或由于引用未知列而导致错误。
我发现的关于引用关系表的其他答案只建议包含关系键的表名,如 My_Relation_Table 但 App Maker 中的表名似乎不符合这种类型的命名约定。如果有人可以帮助我解决这个问题,我将不胜感激。
添加了相关表格的图片。两个表中都没有外键字段,并且两个表包含的字段“WR_Number”不再相关,因为应用制作工具使用了自定义的关系 API。
解决方案
根据 Bruce 在此处的 Googe-App-Maker 用户组https://groups.google.com/forum/#!topic/appmaker-users/wovN3w3TpT4下发布的有用见解,我能够使用计算的 SQL 模型来获得我的数据库中所有表的列表,然后我使用了一个额外的 SQL 命令来获取关系表中的正确列名,从而得到一个调整后的查询,解决了我的问题。以下是我为实现此目的而采取的步骤:
- 创建了一个计算 SQL 模型,称为“表”,创建了一个字符串类型的字段,并将该字段的名称设置设置为“Tables_in_MyDatabaseKey”。将数据源查询设置为
show tables;
. 创建了一个空白页面,创建了一个将数据源设置为“表格”的列表小部件,在列表行中创建了一个标签小部件并将绑定设置为@datasource.item.Tables_in_MyDatabaseKey
. 这导致能够看到我的关系表的正确表名。 - 创建了另一个计算的 SQL 模型,称为“TableDescription”,创建了一个字符串类型的字段并将该字段的名称设置设置为“字段”。将数据源查询设置为
DESCRIBE MyDBTableName;
(此部分已被编辑以将DESCRIPTION更改为DESCRIBE,感谢@Morfinismo指出此错误)。在我新创建的页面中添加了另一个列表小部件并将数据源设置为“TableDescription”,在此列表行中创建了一个标签小部件并将绑定设置为@datasource.item.Field
. 这在我的表中显示了正确的列名。
修正后的 SQL 查询如下:
SELECT
YEAR(Date + INTERVAL 3 MONTH) AS WaterYear,
SUM(IF(DATE_FORMAT(Date,'%m') = '10',Water_Use_Gallons,null)) as 'Oct',
SUM(IF(DATE_FORMAT(Date,'%m') = '11',Water_Use_Gallons,null)) as 'Nov',
SUM(IF(DATE_FORMAT(Date,'%m') = '12',Water_Use_Gallons,null)) as 'Dec',
SUM(IF(DATE_FORMAT(Date,'%m') = '01',Water_Use_Gallons,null)) as 'Jan',
SUM(IF(DATE_FORMAT(Date,'%m') = '02',Water_Use_Gallons,null)) as 'Feb',
SUM(IF(DATE_FORMAT(Date,'%m') = '03',Water_Use_Gallons,null)) as 'Mar',
SUM(IF(DATE_FORMAT(Date,'%m') = '04',Water_Use_Gallons,null)) as 'Apr',
SUM(IF(DATE_FORMAT(Date,'%m') = '05',Water_Use_Gallons,null)) as 'May',
SUM(IF(DATE_FORMAT(Date,'%m') = '06',Water_Use_Gallons,null)) as 'Jun',
SUM(IF(DATE_FORMAT(Date,'%m') = '07',Water_Use_Gallons,null)) as 'Jul',
SUM(IF(DATE_FORMAT(Date,'%m') = '08',Water_Use_Gallons,null)) as 'Aug',
SUM(IF(DATE_FORMAT(Date,'%m') = '09',Water_Use_Gallons,null)) as 'Sep',
SUM(Water_Use_Gallons) as Total
FROM WaterUseData, WaterUseDataPermits_HAS_Permits
WHERE WaterUseData.id = WaterUseDataPermits_HAS_Permits.WaterUseDataPermits_fk AND WaterUseDataPermits_HAS_Permits.Permits_fk = :PermitKey
GROUP BY YEAR(Date + INTERVAL 3 MONTH)
ORDER BY YEAR(Date + INTERVAL 3 MONTH) ASC
推荐阅读
- sql - MSSQL WHERE YEAR 子句返回所有日期而不是指定日期
- asp.net - 通过vb.net中的foreach循环在列表中插入类属性
- python - 用整数规划求解最小化
- sql - hibernate如何登录哪部分代码导致了给定的SQL
- javascript - 反应用户引用不向字段添加焦点状态
- json - 数据帧到 JSON 的转换
- gitlab-ci - 如何在 GitLab 管道中运行安全代码扫描?
- c++ - 如何使用模板类在 C++ 中正确进行多重继承?
- c# - ASP.NET Core web.config 位置使用
- vue.js - 通过 axios 发出 Post 请求时将 HttpListenerContext.User 设为 null