使用 JOIN (?) 故意 return 比行多的结果
Using JOIN (?) to intentionally return more results than rows
很抱歉问这个问题需要这么长的细节。
有四个 table(与研究有关,与体育设施没有任何关系)。它们如下:
1) 假设第一个 table 是网球场的列表,假设有数百种可能性(不仅仅是室内和室外)。
-------------
TENNIS_COURTS
ID Type
-------------
1 Indoor
2 Outdoor
…
2) 我们想记下一年中的哪一天可以出租。为防止出现冗余行,我们可以列出单独的日期(例如,仅是一年中的第 2 天,输入为 "From:2"、"To:2")或块(例如,从第 24 天到第 25 天,输入如 "From:24"、"To:25")。在这个例子中,室内球场是最可用的,而室外球场只有两个日期范围(对于冬天来说显然不现实)。
---------------------------
DAYS_AVAILABLE
ID ProductID From To
---------------------------
1 1 2 2 《 Indoor
2 2 24 25 《 Outdoor
3 2 140 170 《 Outdoor
4 1 280 300 《 Indoor
5 1 340 345 《 Indoor
…
3) 我们还想添加一个属性列表,随着时间的推移会变得很长。因此,与其将这些合并到字段规则中,不如使用属性 table.
-----------------------
ATTRIBUTES
ID Attribute
-----------------------
1 Age of Player
2 Time of Day
3 Outside Temperature
…
4) 最后,我们想添加一份租用场地时要考虑的注意事项(或因素)列表。在此示例中,受伤风险适用于室内和室外场地,但能见度和温度仅适用于室外。
--------------------------------------------------
CONSIDERATIONS
ID ProductID AttributeID Effect Link
--------------------------------------------------
1 1 1 Risk of injury www… 《 Indoor
2 2 1 Risk of injury www… 《 Outdoor
3 2 2 Hard to see www… 《 Outdoor
4 2 3 Gets cold www… 《 Outdoor
…
利用上面的单个 tables,我们想创建一个合并的已保存视图,其中至少包含一个范围内每个日期的行,从一年的第一天开始(其中法院可用)到一年的最后一天(法院可用)。我们还想重复所列每一天的适用注意事项。
根据上面显示的数据,它看起来像这样:
----------------------------------------
CONSOLIDATED VIEW
Day Court Consideration Link
----------------------------------------
2 Indoor 《 from DAYS_AVAILABLE
2 Indoor Risk of injury www… 《 from CONSIDERATIONS
24 Outdoor 《 from DAYS_AVAILABLE
24 Outdoor Risk of injury www… 《 from CONSIDERATIONS
24 Outdoor Hard to see www… 《 from CONSIDERATIONS
24 Outdoor Gets cold www… 《 from CONSIDERATIONS
25 Outdoor 《 from DAYS_AVAILABLE
25 Outdoor Risk of injury www… 《 from CONSIDERATIONS
25 Outdoor Hard to see www… 《 from CONSIDERATIONS
25 Outdoor Gets cold www… 《 from CONSIDERATIONS
…
然后我们可以查询合并视图(例如,"SELECT * FROM CONSOLIDATED_VIEW where Day = 24")以生成如下简单的输出:
Court: Indoor
Available: 24th day
Note: Risk of injury (www…)
Hard to see (www…)
Gets cold (www…)
我们想从统一视图中生成上面显示的示例,因为一旦数据存储,它就不会频繁更改,而且我们很可能不会一次只查询一天。 Web 客户端更有可能将所有行提取到一个大数组中(TBD 基于确定总大小),然后将其呈现给用户而无需进一步的服务器交互。
我们可以仅使用 SQL 查询生成 CONSLIDATED_TABLE 还是我们需要执行一些其他编码(例如,PHP 或 NodeJS)?
您问题中的真正问题是:我怎样才能获得可用日期的列表,以便我可以加入我的其他 table 并生成我的输出,对吗?我的意思是,有了天数列表,您只需加入其他 tables.
由于您的列表(一年中的几天)有限,我建议创建一个 table,其中包含 365(或 366)天(1、2、3、.. .) 并与其他 table 加入。查询将是 smtg 类似于:
SELECT ... -- fields u want
FROM YOUR_NEW_TABLE n
JOIN DAYS_AVAILABLE D on (n.DAY between D.From and D.To)
JOIN ... -- other tables that you need info
很抱歉问这个问题需要这么长的细节。
有四个 table(与研究有关,与体育设施没有任何关系)。它们如下:
1) 假设第一个 table 是网球场的列表,假设有数百种可能性(不仅仅是室内和室外)。
-------------
TENNIS_COURTS
ID Type
-------------
1 Indoor
2 Outdoor
…
2) 我们想记下一年中的哪一天可以出租。为防止出现冗余行,我们可以列出单独的日期(例如,仅是一年中的第 2 天,输入为 "From:2"、"To:2")或块(例如,从第 24 天到第 25 天,输入如 "From:24"、"To:25")。在这个例子中,室内球场是最可用的,而室外球场只有两个日期范围(对于冬天来说显然不现实)。
---------------------------
DAYS_AVAILABLE
ID ProductID From To
---------------------------
1 1 2 2 《 Indoor
2 2 24 25 《 Outdoor
3 2 140 170 《 Outdoor
4 1 280 300 《 Indoor
5 1 340 345 《 Indoor
…
3) 我们还想添加一个属性列表,随着时间的推移会变得很长。因此,与其将这些合并到字段规则中,不如使用属性 table.
-----------------------
ATTRIBUTES
ID Attribute
-----------------------
1 Age of Player
2 Time of Day
3 Outside Temperature
…
4) 最后,我们想添加一份租用场地时要考虑的注意事项(或因素)列表。在此示例中,受伤风险适用于室内和室外场地,但能见度和温度仅适用于室外。
--------------------------------------------------
CONSIDERATIONS
ID ProductID AttributeID Effect Link
--------------------------------------------------
1 1 1 Risk of injury www… 《 Indoor
2 2 1 Risk of injury www… 《 Outdoor
3 2 2 Hard to see www… 《 Outdoor
4 2 3 Gets cold www… 《 Outdoor
…
利用上面的单个 tables,我们想创建一个合并的已保存视图,其中至少包含一个范围内每个日期的行,从一年的第一天开始(其中法院可用)到一年的最后一天(法院可用)。我们还想重复所列每一天的适用注意事项。
根据上面显示的数据,它看起来像这样:
----------------------------------------
CONSOLIDATED VIEW
Day Court Consideration Link
----------------------------------------
2 Indoor 《 from DAYS_AVAILABLE
2 Indoor Risk of injury www… 《 from CONSIDERATIONS
24 Outdoor 《 from DAYS_AVAILABLE
24 Outdoor Risk of injury www… 《 from CONSIDERATIONS
24 Outdoor Hard to see www… 《 from CONSIDERATIONS
24 Outdoor Gets cold www… 《 from CONSIDERATIONS
25 Outdoor 《 from DAYS_AVAILABLE
25 Outdoor Risk of injury www… 《 from CONSIDERATIONS
25 Outdoor Hard to see www… 《 from CONSIDERATIONS
25 Outdoor Gets cold www… 《 from CONSIDERATIONS
…
然后我们可以查询合并视图(例如,"SELECT * FROM CONSOLIDATED_VIEW where Day = 24")以生成如下简单的输出:
Court: Indoor
Available: 24th day
Note: Risk of injury (www…)
Hard to see (www…)
Gets cold (www…)
我们想从统一视图中生成上面显示的示例,因为一旦数据存储,它就不会频繁更改,而且我们很可能不会一次只查询一天。 Web 客户端更有可能将所有行提取到一个大数组中(TBD 基于确定总大小),然后将其呈现给用户而无需进一步的服务器交互。
我们可以仅使用 SQL 查询生成 CONSLIDATED_TABLE 还是我们需要执行一些其他编码(例如,PHP 或 NodeJS)?
您问题中的真正问题是:我怎样才能获得可用日期的列表,以便我可以加入我的其他 table 并生成我的输出,对吗?我的意思是,有了天数列表,您只需加入其他 tables.
由于您的列表(一年中的几天)有限,我建议创建一个 table,其中包含 365(或 366)天(1、2、3、.. .) 并与其他 table 加入。查询将是 smtg 类似于:
SELECT ... -- fields u want
FROM YOUR_NEW_TABLE n
JOIN DAYS_AVAILABLE D on (n.DAY between D.From and D.To)
JOIN ... -- other tables that you need info