Scott, can you expound on what 1 row would be returned, ideally? The
one with the shortest distance? Or a row with the sums of inc_level1
... inc_level7 ?
Looks to me like you're trying to locate all the ZIP codes within a
given radius of (in this case) ZIP 94949 with the query below. Yes/no?
Dan
Scott Haneda wrote:
Mysql 4.0.18
+------------+---------------+------+-----+----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+----------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| zipcode | char(5) | | MUL | | |
| inc_level1 | int(11) | | | 0 | |
| inc_level2 | int(11) | | | 0 | |
| inc_level3 | int(11) | | | 0 | |
| inc_level4 | int(11) | | | 0 | |
| inc_level5 | int(11) | | | 0 | |
| inc_level6 | int(11) | | | 0 | |
| inc_level7 | int(11) | | | 0 | |
| latitude | double(12,6) | | | 0.000000 | |
| longitude | double(12,6) | | | 0.000000 | |
| created | timestamp(14) | YES | | NULL | |
+------------+---------------+------+-----+----------+----------------+
My query is this:
SELECT b.zipcode,
b.inc_level1, b.inc_level2, b.inc_level3,
b.inc_level4, b.inc_level5, b.inc_level6,
b.inc_level7,
(3956 * (2 *
ASIN(SQRT(POWER(SIN(((a.latitude-b.latitude)*0.017453293)/2),2) +
COS(a.latitude*0.017453293) * COS(b.latitude*0.017453293) *
POWER(SIN(((a.longitude-b.longitude)*0.017453293)/2),2))))) AS distance
FROM zipcodes a, zipcodes b
WHERE a.zipcode = "94949"
GROUP BY distance having distance <= "10"
Describe yields:
+-------+------+---------------+----------+---------+-------+-------+-------
----------------------------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra
|
+-------+------+---------------+----------+---------+-------+-------+-------
----------------------------------------------------+
| a | ref | position | position | 5 | const | 1 | Using
where; Using index; Using temporary; Using filesort |
| b | ALL | NULL | NULL | NULL | NULL | 38623 |
|
+-------+------+---------------+----------+---------+-------+-------+-------
----------------------------------------------------+
Its pretty quick, even 500 miles is under half a second, if there is
anything I can do to add indexes and such, let me know, the main issue is,
in a 500 mile search, I don't need back 1839 rows as in this case, I need
just one, where each of the b.inc_level1-7 are added up, just adding in
SUM(b.inc_level7) still yields me 1839 rows in this case.
To do this at the application level is painfully slow, I can shove the data
into a temp table at get it pretty easy, but I thought there would be a
simple way.
--
Dan Buettner
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]