使用JOIN(?)有意返回比行

时间:2017-03-07 20:04:25

标签: mysql sql-view

对于提出问题所需的详细信息,我们深表歉意。

有四张桌子(与研究有关,与体育设施无关)。他们如下:

1)假设第一张桌子是网球场的名单,让我们说有数百种可能性(不仅仅是室内和室外)。

-------------
TENNIS_COURTS
ID  Type
-------------
1   Indoor
2   Outdoor
…

2)我们想要注意他们一年中的哪一天可以出租。为了防止冗余行,我们可以列出单个日期(例如,一年中的第二天,输入为“从:2”,“到:2”)或块(例如,从第24天到第25天,输入如“从:24”,“到: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)我们还想添加一个属性列表,这些属性会随着时间的推移而增长很长。因此,不是将这些结合到字段规则中,而是存在属性表。

-----------------------
       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
 …

利用上面的各个表格,我们想要创建一个统一保存的视图,该视图包含该范围内每个日期的至少一行,从一年的第一天开始(法院可用)到一年的最后一天(法院可用)。我们还想重复列出的每一天的适用注意事项。

根据上面显示的数据,它看起来像这样:

----------------------------------------
           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)?

1 个答案:

答案 0 :(得分:1)

你问题中真正的问题是:如何获得可用日期列表,以便我可以加入我的其他表并生成输出,对吧?我的意思是,拥有一个日期列表,您需要的就是加入其他表格。

由于您有一个有限的列表(一年中的几天),我建议创建一个包含365(或366)天(1,2,3,...)的单个列的表,并加入它你的其他桌子。该查询的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