2017-08-01 63 views
0

要跟蹤訂單,我需要訂單表中的訂單ID,並檢查訂單是在特定日期範圍內訂購的訂單表。使用下面的查詢我可以得到ID的,但它會返回ID 3也是不需要的。Mysql查詢,僅返回記錄哪些日期不與其他記錄的日期重疊

示例:請參閱命令表。 id 3的第一個日期與id 2的最後一個日期重疊。

如何更改查詢,如果它的第一個日期重疊其他id的最後一個日期或它甚至可能不會返回id?

SELECT id 
FROM orders 
WHERE id in(
SELECT id 
FROM orderdates 
WHERE 
orderdate BETWEEN '2017-06-01' AND '2017-06-30' 
GROUP BY id); 


orders 
id sent 
1 1 
2 1 
3 1 


orderdates 
id orderdate 
1 2017-6-10 
1 2017-6-11 
1 2017-6-12 
1 2017-6-13 
2 2017-6-14 
2 2017-6-15 
2 2017-6-16 
2 2017-6-17 <--- Last date of id 2 
3 2017-6-17 <--- First date of id 3 
3 2017-6-18 
3 2017-6-19 
3 2017-6-20 
+0

爲什麼它不應該返回ID = 3時,它是你的裏面日期參數? – Matt

+0

是的,返回3,但如果日期與其他日期交錯,可以過濾嗎? –

+1

雖然邏輯是什麼?如果一個日期重疊,擺脫了最高重疊ID日期的所有ID? – Matt

回答

0

也許這其中我比較分鐘日期對最大日起每ID每一個ID

select u.* 
from t u 
where u.id not in 
(
select z.id 
from 
(
select s.*,t.id tid,t.mindt tmindt,t.maxdt tmaxdt 
from 
(
select id, min(dt) mindt,max(dt) maxdt 
from t 
group by id 
order by id 
) s 
join 
(select id, min(dt) mindt,max(dt) maxdt 
from t 
group by id 
order by id 
) t on 
    t.id <> s.id and 
    t.maxdt = s.mindt 
) z 
) 
order by u.id,u.dt 

鑑於此

truncate table t; 
insert into t values 
(1,'2017-01-01'),(1,'2017-01-02'), 
(2,'2017-01-03'),(2,'2017-01-04'), 
(3,'2017-01-04') 

結果

+------+------------+ 
| id | dt   | 
+------+------------+ 
| 1 | 2017-01-01 | 
| 1 | 2017-01-02 | 
| 2 | 2017-01-03 | 
| 2 | 2017-01-04 | 
+------+------------+ 
4 rows in set (0.00 sec) 

給這個

truncate table t; 
insert into t values 
(1,'2017-01-01'),(1,'2017-01-02'), 
(2,'2017-01-03'),(2,'2017-01-04'), 
(3,'2017-01-04'), 
(4,'2017-01-04'),(4,'2017-01-06'); 

結果

+------+------------+ 
| id | dt   | 
+------+------------+ 
| 1 | 2017-01-01 | 
| 1 | 2017-01-02 | 
| 2 | 2017-01-03 | 
| 2 | 2017-01-04 | 
+------+------------+ 
4 rows in set (0.00 sec) 

鑑於

truncate table t; 
insert into t values 
(1,'2017-01-01'),(1,'2017-01-02'), 
(2,'2017-01-03'),(2,'2017-01-04'), 
(3,'2017-01-04'), 
(4,'2017-01-05'),(4,'2017-01-06'); 

結果

+------+------------+ 
| id | dt   | 
+------+------------+ 
| 1 | 2017-01-01 | 
| 1 | 2017-01-02 | 
| 2 | 2017-01-03 | 
| 2 | 2017-01-04 | 
| 4 | 2017-01-05 | 
| 4 | 2017-01-06 | 
+------+------------+ 
6 rows in set (0.02 sec)