我必须编写一个给出两个A和B系列的函数,如果A元素的任何区域与B元素的任何区域重叠,则返回true,否则返回false。
系列由(粗体为主要)定义:
系列( series_id ,name,base_url,request_number,description)request_number,description:FK(study)
和元素和区域是:
元素( series_id,elem_index )
series_id:FK(系列)
区域( series_id,elem_index,x1,y1,x2,y2 )
series_id,index:FK(element)
到目前为止我尝试的是:
CREATE FUNCTION CheckOverlap(series_id_a, series_id_b, NUMERIC(20,0)) RETURNS BOOL
BEGIN
DECLARE overlap BOOL;
SET overlap = 0;
SELECT EXISTS(
SELECT * FROM region WHERE series_id = series_id_a OR series_id = series_id_b
...
) INTO overlap;
RETURN overlap;
END;
我基本上认为我需要为每个间隔(x1a,x2a)检查所有其他间隔(x1b,x2b)(因此我正在考虑连接,不确定如何)检查x1a< = x2b AND x2a> = x1b(也检查y1a< = y2b AND y2a> = y2b),因为这是交叉点的条件。
实施例(区):
id index x1 y1 x2 y2
| 0 | 0 | 0 | NULL | 1 | NULL |
| 0 | 1 | 0 | 1 | 0 | 1 |
| 1 | 0 | 0.5 | NULL | 2 | NULL |
| 1 | 1 | 0.5 | 0.5 | 2 | 0.5 |
| 2 | 0 | 0 | NULL | 3 | NULL |
[x1,x2]是其他两个为NULL的间隔,否则为正方形[x1,x2,y1,y2]。如果我给了一个id 0和一个id 1,我会检测到这两个系列中元素的两个重叠,一个在具有id索引对(0,0)和(1,0)的区间之间,另一个在具有id索引对(0,1)和(1,1)的正方形。
编辑:我使用的是MySQL 5.1,它没有ST_OVERLAPS或任何其他漂亮的几何类型/函数。