计算的 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 中的正确列名,从而导致调整后的查询解决了我的问题。以下是我为完成此任务所采取的步骤:
- 创建了一个计算的 SQL 模型,将其命名为 'Tables',创建了一个
字符串类型的字段,并将字段的名称设置为
'Tables_in_MyDatabaseKey'。将数据源查询设置为
show
tables;
。创建了一个空白页面,创建了一个列表小部件
数据源设置为 'Tables',在列表中创建了一个标签小部件
行并将绑定设置为 @datasource.item.Tables_in_MyDatabaseKey
。
这导致能够看到我的正确 table 名称
关系 table.
- 创建了另一个计算 SQL 模型,将其命名为 'TableDescription',
创建一个字符串类型的字段并设置名称设置
字段到 'Field'。将数据源查询设置为
DESCRIBE
MyDBTableName;
(已编辑此部分以将 DESCRIPTION 更改为 DESCRIBE,感谢@Morfinismo 指出此错误)。在我新创建的页面中添加了另一个列表小部件
并将数据源设置为 'TableDescription',创建了一个标签小部件
在此列表行中并将绑定设置为 @datasource.item.Field
。
这在我的 table. 中显示了正确的列名称
更正后的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
我有两个 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 中的正确列名,从而导致调整后的查询解决了我的问题。以下是我为完成此任务所采取的步骤:
- 创建了一个计算的 SQL 模型,将其命名为 'Tables',创建了一个
字符串类型的字段,并将字段的名称设置为
'Tables_in_MyDatabaseKey'。将数据源查询设置为
show tables;
。创建了一个空白页面,创建了一个列表小部件 数据源设置为 'Tables',在列表中创建了一个标签小部件 行并将绑定设置为@datasource.item.Tables_in_MyDatabaseKey
。 这导致能够看到我的正确 table 名称 关系 table. - 创建了另一个计算 SQL 模型,将其命名为 'TableDescription',
创建一个字符串类型的字段并设置名称设置
字段到 'Field'。将数据源查询设置为
DESCRIBE MyDBTableName;
(已编辑此部分以将 DESCRIPTION 更改为 DESCRIBE,感谢@Morfinismo 指出此错误)。在我新创建的页面中添加了另一个列表小部件 并将数据源设置为 'TableDescription',创建了一个标签小部件 在此列表行中并将绑定设置为@datasource.item.Field
。 这在我的 table. 中显示了正确的列名称
更正后的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