我们知道" Where In" sql查询为输入执行OR。
抱歉,我无法上传图片..所以我创建了我的数据库视图的样子。 例如
<table>
<tr>
<td>RoomBlockDateID</td>
<td>RoomBlockID</td>
<td>AvailableDate</td>
<td>PublicRemaining</td>
</tr>
<tr>
<td>2105</td>
<td>633</td>
<td>2009-10-14 00:00:00:000</td>
<td>0</td>
</tr>
<tr>
<td>2106</td>
<td>633</td>
<td>2009-10-15 00:00:00:000</td>
<td>100</td>
</tr>
<tr>
<td>2107</td>
<td>633</td>
<td>2009-10-16 00:00:00:000</td>
<td>150</td>
</tr>
<tr>
<td>2108</td>
<td>633</td>
<td>2009-10-17 00:00:00:000</td>
<td>100</td>
</tr>
<tr>
<td>2109</td>
<td>635</td>
<td>2009-10-14 00:00:00:000</td>
<td>0</td>
</tr>
<tr>
<td>2110</td>
<td>635</td>
<td>2009-10-15 00:00:00:000</td>
<td>70</td>
</tr>
<tr>
<td>2111</td>
<td>635</td>
<td>2009-10-16 00:00:00:000</td>
<td>90</td>
</tr>
<tr>
<td>2112</td>
<td>635</td>
<td>2009-10-17 00:00:00:000</td>
<td>0</td>
</tr>
这是我做的事情
Select distinct RoomBlockID from Table where availabledate in ('10/14/2009', '10/15/2009', '10/16/2009') and PublicRemaining > 0
然后它将返回RoomBlockID 631和633.但是我在酒店预订系统中寻找的是,只有当publicrelocking是&gt; 0表示所有给定日期,然后返回正确的RoomBlockIDs。查看上面的查询,它将不返回任何内容。但是,如果我将查询修改为
Select distinct RoomBlockID from Table where availabledate in ('10/15/2009', '10/16/2009', '10/17/2009') and PublicRemaining > 0
然后它将返回631而不是633。
我可以使用光标并浏览每个Roomblockids并检查所有必需的日期是否仍然存在&gt; 0然后返回RoomBlockID。但我想知道是否有查询要这样做?
请指教。 谢谢
答案 0 :(得分:0)
添加计数字段,并使用Having
子句:
SELECT
id,
count(availableDate) as ct
FROM
rooms
WHERE availableDate IN("2009-10-10","2009-10-11", "2009-10-12")
AND publicRemaining > 0
GROUP BY id
HAVING ct = 3
如果您筛选5个元素并添加contion ct = 5
- 这可确保有一个条目
每天。 (假设每个房间和每天只有一排)
此查询返回2个可能的房间:http://sqlfiddle.com/#!2/a714e/7
为此,它只有一个房间:http://sqlfiddle.com/#!2/a714e/10
(条件需要匹配IN()
字段内的元素数量)
答案 1 :(得分:0)
如果您的数据库支持INTERSECT集合运算符(可能除非您使用MySQL),您可以使用:
select roomblockid
from table
where availabledate = '10/15/2009'
and PublicRemaining > 0
intersect
select roomblockid
from table
where availabledate = '10/16/2009'
and PublicRemaining > 0
intersect
select roomblockid
from table
where availabledate = '10/17/2009'
and PublicRemaining > 0
如果没有,你可以使用:
Select RoomBlockID
from Table
where availabledate in ('10/15/2009', '10/16/2009', '10/17/2009')
and PublicRemaining > 0
group by RoomBlockID
having count(*) = 3