使用 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