我有下表,可以预订
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/selected_gray"/>
<item android:state_pressed="true" android:drawable="@drawable/pressed_gray"/>
</selector>
然后我有一张跑步表
CREATE TABLE booking (
bookingID INT UNSIGNED NOT NULL AUTO_INCREMENT,
customerID INT,
runID INT,
startDate DATETIME,
endDate DATETIME,
dateBookedOn TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (bookingID),
INDEX idx_start (startDate),
INDEX idx_end (endDate),
FOREIGN KEY (runID) REFERENCES RUn(RunID),
FOREIGN KEY (customerID) REFERENCES customer(CustomerID)
)
我正在查询运行表,以获取不在预订表中两个日期之间的所有runID,如下所示。
CREATE TABLE run
(
RunID INT UNSIGNED NOT NULL AUTO_INCREMENT,
RunName VARCHAR(15),
PricePerNight DECIMAL(3,2),
primary key (RunID)
);
如果日期与查询日期重叠,它们如何更改查询以选择在它们之间没有任何日期的runID,它们将包含在结果集中。
即如果新预订的startDate 2015-07-15和endDate 2015-07-21那么它仍将显示在查询结果集中。
答案 0 :(得分:1)
您的查询可以执行您想要的操作,但可能会有点慢:如果可以,请避免使用NOT IN。这应该做同样的事情但速度更快:
SELECT a.*
FROM run a
LEFT JOIN booking b ON a.runID=b.runID
AND startDate>= '2015-07-19' AND endDate<= '2015-07-25'
WHERE b.runID IS NULL;
还要避免从数据库中转换数据:如果你想/必须转换任何东西,转换你的变量:转换变量= 1值转换,从数据库中转换数据是N值转换,加上索引不能已经用完了。