计算的 SQL 查询中的多对多关系 Table 引用 - 应用程序制作工具

Many-to-Many Relation Table Reference in Calculated SQL Query - App Maker

我有两个 tables,WaterUseData 和 PermitList,具有多对多关系,在默认数据库中的 table 中捕获,名称指定为 'WaterUseDataPermits - RelatedPermits' .我是 运行 针对 WaterUseData table 计算的 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] 试图引用持有关系键的 table 之外,我还尝试了 'WaterUseDataPermits - RelatedPermits'、"WaterUseDataPermits - RelatedPermits"、'WaterUseDataPermits - RelatedPermits'、['WaterUseDataPermits - RelatedPermits']、["WaterUseDataPermits - RelatedPermits"] 和 WaterUseDataPermits_RelatedPermits。所有这些都导致 SQL 语法错误或由于引用未知列而导致的错误。

我发现的关于引用关系 table 的其他答案只建议为关系键包含 table 名称,例如 My_Relation_Table 但 table App Maker 中的名称似乎不符合此类命名约定。如果有人能帮我解决这个问题,我将不胜感激。

添加了相关 table 的图片。 table 和两个 table 包含的字段 'WR_Number' 中都没有外键字段不再相关,因为 App Maker 使用自定义关系 API.

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

  1. 创建了一个计算的 SQL 模型,将其命名为 'Tables',创建了一个 字符串类型的字段,并将字段的名称设置为 'Tables_in_MyDatabaseKey'。将数据源查询设置为 show tables;。创建了一个空白页面,创建了一个列表小部件 数据源设置为 'Tables',在列表中创建了一个标签小部件 行并将绑定设置为 @datasource.item.Tables_in_MyDatabaseKey。 这导致能够看到我的正确 table 名称 关系 table.
  2. 创建了另一个计算 SQL 模型,将其命名为 'TableDescription', 创建一个字符串类型的字段并设置名称设置 字段到 'Field'。将数据源查询设置为 DESCRIBE MyDBTableName;(已编辑此部分以将 DESCRIPTION 更改为 DESCRIBE,感谢@Morfinismo 指出此错误)。在我新创建的页面中添加了另一个列表小部件 并将数据源设置为 'TableDescription',创建了一个标签小部件 在此列表行中并将绑定设置为 @datasource.item.Field。 这在我的 table.
  3. 中显示了正确的列名称

更正后的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