Triples: (n^3 - 3n^2 +2n)/6 select count(*) from rectangles as r1, rectangles as r2, rectangles as r3 where r1.rect_id delimiter // mysql> create function distance (p1 point,p2 point) -> returns double -> return sqrt(pow(x(p1)-x(p2),2)+pow(y(p1)-y(p2),2)); -> // select max(distance(pt,PointFromText('Point(0 0)'))) from points; Distances from (0,0) to centroids: select min(distance(centroid(rect),PointFromText('Point(0 0)'))) as minD, max(distance(centroid(rect),PointFromText('Point(0 0)'))) as MaxD, avg(distance(centroid(rect),PointFromText('Point(0 0)'))) as avgD, sum(distance(centroid(rect),PointFromText('Point(0 0)'))) as sumD from rectangles; Distances between rectangles: select min(distance(centroid(r1.rect),centroid(r2.rect))) as minD, max(distance(centroid(r1.rect),centroid(r2.rect))) as MaxD, avg(distance(centroid(r1.rect),centroid(r2.rect))) as avgD, sum(distance(centroid(r1.rect),centroid(r2.rect))) as sumD from rectangles as r1,rectangles as r2 where r1.rect_id create function x1 (r polygon) -> returns int -> begin -> declare polystr varchar(100); -> set polystr = astext(r); -> return substr(polystr,10,locate(' ',polystr)-10); -> end; mysql> create function y1 (r polygon) -> returns int -> begin -> declare polystr varchar(100); -> set polystr = astext(r); -> return substr(polystr, locate(' ',polystr)+1, locate(',',polystr)-locate(' ',polystr)-1); -> end; OLD mysql> create function perimeter (r polygon) -> returns double -> begin -> declare w double; -> declare l double; -> set w = 2 * (x(centroid(r)) - x1(r)); -> set l = 2 * (y(centroid(r)) - y1(r)); -> return 2 * (w+l); -> end; -> // mysql> create function width (r polygon) -> returns double -> return 2 * abs((x(centroid(r)) - x1(r))); mysql> create function height (r polygon) -> returns double -> return 2 * abs((y(centroid(r)) - y1(r))); mysql> create function perimeter (r polygon) -> returns double -> return 2*(width(r)+height(r)); select astext(rect),perimeter(rect) as P,area(rect)as A,width(rect),height(rect) from rectangles;