2014-10-13 4 views
1

Я две таблицы сессий и онлайнОбъединить два SQL-запрос

сессия

| id |  time | 
| 1 | 1413170771 | 
| 2 | 1413174398 | 
| 7 | 1413174567 | 

онлайн является

| id | username | city |  lat  |  lon  | 
| 1 |  Jon  | Toronto | 45.4642700 | 9.1895100 | 
| 2 |  Danny | Ottawa | 46.5645600 | 9.3456883 | 
| 7 |  Martin | Calgary | 46.6775339 | 9.5469944 | 

мне нужно estract все время от сессии и все интернет-пользователей и закажите его для расстояний.

Например, если Мартин хочет видеть всех пользователей онлайн и расстояние от него результат должен быть

| id | Users | distance |  time | 
| 7 | Martin |  0  | 1413174567 | 
| 1 | Jon | 100 | 1413170771 | 
| 2 | Danny | 250 | 1413174398 | 

Проблема заключается в том:

Мне нужно извлечь Martin Lat и долгота от онлайн-таблицы затем вычислить расстояние, на расстоянии я хочу использовать этот запрос

 $R = 3959; 
     $lat= ??? 
     $lon= ???? 

     SELECT *, (
     $R * acos(cos(radians($lat)) * cos(radians(lat)) 
     * cos(radians(lon) - radians($lon)) + sin(radians($lat)) * sin(radians(lat)))) AS distance 
     FROM online 
     HAVING distance < $rad 
     ORDER BY distance 
     LIMIT 0 , 20" 
+0

Вы проверить на [PostGIS] (http://postgis.net/) проекта? Вам не нужно иметь дело с функциями триггера ... – vyegorov

+0

Какая СУБД вы используете? Postgres или MySQL? Эти два очень разные –

+0

Я не могу использовать PostGIS –

ответ

1

процедура может сделать магию, проверить это

-- Trigger DDL Statements 
DELIMITER // 

DROP PROCEDURE IF EXISTS cal_distance; 

CREATE PROCEDURE cal_distance (IN var_id INT) 
BEGIN 
DECLARE R INT DEFAULT 0; 
DECLARE var_lat DOUBLE DEFAULT 0; -- NOT USED? 
DECLARE var_lon DOUBLE DEFAULT 0; -- NOT USED? 

--GET lon and lat for John 
SELECT lat INTO var_lat, lon INTO var_lon 
FROM online 
WHERE id = var_id; 

SELECT *, (
R * acos(cos(radians(var_lat)) * cos(radians(var_lat)) 
* cos(radians(lon) - radians(var_lon)) + sin(radians(var_lat)) * sin(radians(lat)))) AS distance 
FROM online LEFT JOIN session 
USING (id) 
HAVING distance >= 0 
ORDER BY distance 
END $$ 

DELIMITER ; 

Для вызова процедуры

CALL cal_distance (1); 

Если вы хотите, чтобы избежать prodecures, пробном

SET @R = 3959; 
SET @var_lon = NULL; 
SET @var_lat = NULL; 

SELECT lat, lon INTO @var_lat, @var_lon 
FROM online 
WHERE id = 1; 

SELECT *, (
@R * acos(cos(radians(@var_lat)) * cos(radians(lat)) 
* cos(radians(lon) - radians(@var_lon)) + sin(radians(@var_lat)) * sin(radians(lat)))) AS distance 
FROM online LEFT JOIN session 
USING (id) 
HAVING distance >= 0 
ORDER BY distance 

DEMO

Только с помощью подзапроса, хотя я не буду предпочитают этот путь.

SELECT *, (
3959* acos(cos(radians(var_lat)) * cos(radians(lat)) 
* cos(radians(lon) - radians(var_lon)) + 
sin(radians(var_lat)) * sin(radians(lat)))) AS distance 
FROM online, (SELECT lat AS var_lat, lon AS var_lon FROM online WHERE id = 1) AS new_table 
HAVING distance >= 0 
ORDER BY distance 

DEMO

+0

@alberto: Решил проблему? –

+0

Спасибо @Rokse, но мне нужен запрос/подзапрос, иначе он не будет работать с моим уровнем абстракции db –

+0

@AlbertoAlibaba: Думаю, теперь ваша проблема должна быть решена. –

Смежные вопросы