我有以下数据库架构:
CREATE TABLE `property` (
`id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL
);
CREATE TABLE `venue` (
`id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`property_id` INT(11) NOT NULL,
`name` VARCHAR(100) NOT NULL
);
CREATE TABLE `venue_available` (
`id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`venue_id` INT(100) NOT NULL,
`day` VARCHAR(10) NOT NULL,
`from_time` TIME NOT NULL,
`to_time` TIME NOT NULL,
`lead_time_in_minutes` INT(11)
);
CREATE TABLE `venue_unavailable` (
`id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`venue_id` INT(100) NOT NULL,
`from_datetime` DATETIME NOT NULL,
`to_datetime` DATETIME NOT NULL
);
CREATE TABLE `venue_reservation` (
`id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`venue_id` INT(100) NOT NULL,
`start_datetime` DATETIME NOT NULL,
`end_datetime` DATETIME NOT NULL
);
我想找到在8月25日(星期六)至8月27日(星期一)的上午10点至下午3点开放活动的物业
这是我尝试过的SQL查询
SELECT
p.id,
p.name AS property_name,
v.name AS venue_name
FROM
venue v
LEFT JOIN
property p ON v.property_id = p.id
-- venue_available
LEFT JOIN
venue_available va_0 ON va_0.venue_id = v.id
LEFT JOIN
venue_available va_1 ON va_1.venue_id = v.id
WHERE 1 = 1
-- venue_available
AND (
(va_0.day = 'sat' AND va_0.from_time <= '2018-08-25 10:00:00' AND va_0.to_time >= '2018-08-25 15:00:00') AND
(va_1.day = 'sun' AND va_1.from_time <= '2018-08-26 10:00:00' AND va_1.to_time >= '2018-08-26 15:00:00')
)
-- venue_unavailable
AND NOT EXISTS (SELECT * FROM venue_unavailable vu WHERE '2018-08-25 10:00:00' <= vu.to_datetime AND '2018-08-26 15:00:00' >= vu.from_datetime)
GROUP BY
p.id;
当前查询的问题是,SQL查询中venue_available
的条件似乎可以正常工作,但是当我添加venue_unavailable
的条件时,它将返回空结果,但是基于我期望有1个结果的数据。
如果您想使用模式和固定装置,这里是SQL小提琴的链接
http://sqlfiddle.com/#!9/33d60f/10
这就是我想要做的
1.获取所有属性(而非场所)的列表
2.使用
您能帮我解决这个问题吗?x
谢谢。
UPDATE1
我关注了以下博文,以确定会场Select rows that are not between dates (reservation)不可用的重叠日期
答案 0 :(得分:1)
好的,所以我解决它的方法是使用现在正在工作的子查询。
我现在将WHERE子句与类似的东西一起使用
// GET: api/Review
public IQueryable<Review> Get_Review()
{
return db.Review;
}
// GET: api
public IEnumerable<Review> Get_store(string aa)
{
//This does not work
return db.Review.Any(s => s.site == aa);
}
// GET: api/Review/5
[ResponseType(typeof(Review))]
public IHttpActionResult Get_Review(int id)
{
Review review = db.Review.Find(id);
if (Review == null)
{
return NotFound();
}
return Ok(Review);
}
这似乎已经做好了。