我正在实施一个应用程序,提供了几个场馆的开放时间。我的DB实现的简化版本由两个表组成:
+-----------+ +------------------+
| Venue | | opening_hour |
+-----------+ +------------------+
| venue_id | | opening_hour_id |
| name | | day |
+-----------+ | close_time |
| open_time |
| venue_id |
+------------------+在这种情况下,场地和开放时间之间存在一对多的关系。
现在,我想检索数据库中所有可供使用的场馆及其相应的开放时间的列表。为了解决这个问题,我使用了以下代码:
SELECT ven.name as name, oh.day as day
FROM venue ven INNER JOIN opening_hour oh
ON oh.venue_id = ven.venue_id使用此实现,对于每一天的开放时间,我都会得到一个包含场地名称和日期值的行结果。这意味着,如果一个场地每周开放6天,我将收到6排相同的名字和相应的一天。因此,我发现自己有很多重复的数据,我必须在服务器端操作这些数据。
从我的小DB知识中,我能想到的唯一两个解决方案是要么遵循当前的解决方案,要么提取所有的场馆,然后对每个场馆执行一个查询,以便提取它们的开放时间。后者显然是更糟的解决方案,因为它需要大量荒谬的DB请求。
有谁能找到更好的方法吗?理想的做法是接收一行,其中包含场地名称和由所有开放时间组成的数组。
注意:不确定这在本例中是否相关,但我使用的是PostgreSQL数据库。
发布于 2016-06-21 10:03:18
这将给出场地名称和所有开放日期的数组:
SELECT ven.name, array_agg(oh.day)
FROM venue ven
NATURAL JOIN opening_hour oh
GROUP BY ven.name;发布于 2016-06-21 10:16:43
对于使用MSSQL的;
SELECT
v.name,
REPLACE(REPLACE(REPLACE('['+(
SELECT
'''' + convert(nvarchar(max),s2.open_time) + '''' as a
FROM opening_hour s2
WHERE s2.venue_id= s.venue_id
FOR XML PATH('')
) + ']','<a>',''),'</a>',','),',]',']') as opening_hours
FROM opening_hour s
INNER JOIN Venue v on v.venue_id = s.venue_id
GROUP BY s.venue_id,v.name这里需要注意的是,它不返回数据类型Array。它只是一个数组格式的字符串。
https://stackoverflow.com/questions/37940580
复制相似问题