"Shaun" <[EMAIL PROTECTED]> wrote on 01/23/2006 11:51:32 AM:

> Hi,
> 
> We have a dataset of uk postcodes and their relevant X-Coordinates and 
> Y-Coordinates, a table of properties (houses), a table of users and a 
table 
> of offices - users work in an office - table structures below.
> 
> Is it possible to run a search of all properties in the properties table 

> that come within a certain distance of the users postcode, currently we 
do 
> this by downloading all properties into an array and stripping out the 
ones 
> that don't come within the radius with php.
> 
> Any advice would be greatly appreciated.
> 
> 
> # ---------- MySQL dump ----------
> #
> # Table structure for table 'Offices'
> #
> CREATE TABLE Offices (
>   Office_ID int(11)  DEFAULT '' NOT NULL auto_increment,
>   Subscriber_ID int(11)    ,
>   Type varchar(10)    ,
>   Address_Line_1 varchar(50)    ,
>   Address_Line_2 varchar(50)    ,
>   City varchar(50)    ,
>   County varchar(50)    ,
>   Postcode varchar(10)    ,
>   Telephone varchar(12)    ,
>   Fax varchar(12)    ,
>   Radius tinyint(4)    ,
>   PRIMARY KEY (Office_ID)
> );
> 
> #
> # Table structure for table 'Postcodes'
> #
> CREATE TABLE Postcodes (
>   PCDSECT varchar(6)  DEFAULT '' NOT NULL ,
>   SORTSECT varchar(6)    ,
>   PCDDIST varchar(4)    ,
>   SORTDIST varchar(4)    ,
>   PCDAREA char(2)    ,
>   X_COORD double(7,1) unsigned   ,
>   Y_COORD double(7,1) unsigned   ,
>   PRIMARY KEY (PCDSECT)
> );
> 
> #
> # Table structure for table 'Properties'
> #
> CREATE TABLE Properties (
>   CHK varchar(20)    ,
>   Property_ID int(11)  DEFAULT '' NOT NULL auto_increment,
>   Insertion_Date date    ,
>   Status varchar(20)    ,
>   Property_Name_Or_Number varchar(50)    ,
>   Address_Line_1 varchar(50)    ,
>   Address_Line_2 varchar(50)    ,
>   City varchar(50)    ,
>   County varchar(50)    ,
>   Postcode varchar(12)    ,
>   PRIMARY KEY (Property_ID)
> );
> 
> #
> # Table structure for table 'Users'
> #
> CREATE TABLE Users (
>   User_ID int(11)  DEFAULT '' NOT NULL auto_increment,
>   Office_ID int(11)    ,
>   Type varchar(20)    ,
>   Title varchar(4)    ,
>   Firstname varchar(20)    ,
>   Lastname varchar(20)    ,
>   Password varchar(20)  DEFAULT '' NOT NULL ,
>   Email varchar(50)    ,
>   PRIMARY KEY (User_ID)
> );
> 
> # ----------- Dump ends -----------
> 
> 

Assuming a general distance formula of R=SQR((x1-x2)^2 + (y1-y2)^2)


Here is a parameterized example for a single user:

SET @userID = ?? /* your pick */
SET @TargetR = ?? /* again, your pick */

SELECT @sourceX:= pc.X_COORD, @sourceY := pc.Y_COORD
FROM postcodes pc
INNER JOIN office o
    ON o.postcode = PC.pcdsect
INNER JOIN users u
    ON u.office_id = o.office_id
    AND u.user_id = @userID;

CREATE TEMPORARY TABLE tmpShortList (KEY(pcdsect)) SELECT 
    pc.pcdsect, 
    (@sourceX - pc.X_COORD) X_DIFF,
    (@sourceY - pc.Y_COORD) Y_DIFF,
FROM Postcodes pc
WHERE pc.X_COORD BETWEEN (@SourceX - @TargetR) and (@SourceX + @TargetR)
AND pc.Y_COORD BETWEEN (@SourceY - @TargetR) and (@SourceY + @TargetR)
HAVING SQR(X_DIFF*X_DIFF + Y_DIFF*Y_DIFF) <= @TargetR;

Now you have a table of all Postal codes (tmpShortList) that fall within a 
certain radius (@TargetR) of a certain user (@UserID). Do with it what you 
will. In your example, you wanted to see all properties were within that 
search radius. 

SELECT p.*
FROM properties p
INNER JOIN tmpShortList sl
    ON sl.pcdsect = p.postcode;



HTH!

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine



Reply via email to