首页 > 解决方案 > 计算 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。

许可清单表

用水表

标签: mysqlgoogle-app-maker

解决方案


根据 Bruce 在此处的 Googe-App-Maker 用户组https://groups.google.com/forum/#!topic/appmaker-users/wovN3w3TpT4下发布的有用见解,我能够使用计算的 SQL 模型来获得我的数据库中所有表的列表,然后我使用了一个额外的 SQL 命令来获取关系表中的正确列名,从而得到一个调整后的查询,解决了我的问题。以下是我为实现此目的而采取的步骤:

  1. 创建了一个计算 SQL 模型,称为“表”,创建了一个字符串类型的字段,并将该字段的名称设置设置为“Tables_in_MyDatabaseKey”。将数据源查询设置为show tables;. 创建了一个空白页面,创建了一个将数据源设置为“表格”的列表小部件,在列表行中创建了一个标签小部件并将绑定设置为@datasource.item.Tables_in_MyDatabaseKey. 这导致能够看到我的关系表的正确表名。
  2. 创建了另一个计算的 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

推荐阅读