2013-11-17 1 views
2

У меня есть следующий запрос, который возвращает следующую таблицу:SQL с присоединиться два и заказ пределом

(select trace_3733_3742.Sequance,trace_3733_3742.MainSequenceNum,trace_3733_3742.hopAddress addr from `trace_3733_3742` where MainSequenceNum = 5668799415 or MainSequenceNum = 5671689631); 


+----------+-----------------+------------+ 
| Sequance | MainSequenceNum | addr  | 
+----------+-----------------+------------+ 
|  1 |  5668799415 | 2229485073 | 
|  3 |  5668799415 | 2229496574 | 
|  4 |  5668799415 | 2258501244 | 
|  5 |  5668799415 | 3286073269 | 
|  6 |  5668799415 | 3241391462 | 
|  7 |  5668799415 | 3241390941 | 
|  8 |  5668799415 | 3241393449 | 
|  9 |  5668799415 | 3241393534 | 
|  10 |  5668799415 | 3561607085 | 
|  11 |  5668799415 | 71666625 | 

... ...

и у меня есть другая таблица, используя

(SELECT latitude,longitude FROM `GeoLiteCity_Oct2011` WHERE (start_ip_num <= hopaddress) ORDER BY start_ip_num DESC LIMIT 1); 

hopaddress = один из hopaddress из таблицы вверх

, например, :

(SELECT latitude,longitude FROM `GeoLiteCity_Oct2011` WHERE (start_ip_num <= 3561607199) ORDER BY start_ip_num DESC LIMIT 1); 

возвращает результат я хочу

таблица выглядит следующим образом:

+--------------+------------+----------+-----------+ 
| start_ip_num | end_ip_num | latitude | longitude | 
+--------------+------------+----------+-----------+ 
|   0 |   0 |  NULL |  NULL | 
|  16777216 | 16777471 |  -27 |  133 | 
|  16777472 | 16778239 |  35 |  105 | 
|  16778240 | 16779263 |  -27 |  133 | 
|  16779264 | 16781311 |  35 |  105 | 
|  16781312 | 16785407 |  36 |  138 | 

... ...

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

я попытался следующие:

select * from (select trace_3733_3742.Sequance,trace_3733_3742.MainSequenceNum,trace_3733_3742.hopAddress addr from `trace_3733_3742` where MainSequenceNum = 5668799415 or MainSequenceNum = 5671689631) trace 
join GeoLiteCity_Oct2011 loc 
where (loc.start_ip_num <= addr) ORDER BY loc.start_ip_num DESC LIMIT 1 

но это будет возвращать только 1 результат, а не всю таблицу :(

ответ

0

Я хотел бы попробовать что-то вроде этого:

SELECT m.Sequance,m.MainSequenceNum,m.hopAddress, 
    (SELECT g.latitude,g.longitude FROM `GeoLiteCity_Oct2011` AS g 
    WHERE g.start_ip_num <= m.hopAddress 
    ORDER BY g.start_ip_num DESC LIMIT 1) 
FROM `trace_3733_3742` AS m 
WHERE m.MainSequenceNum = 5668799415 or m.MainSequenceNum = 5671689631; 
+0

его, похоже, работает, только если я попытаюсь получить широту или долготу, если я попытаюсь получить их обоих, как вы написали «SELECT g.latitude, g.longitude». I get Код ошибки: 1241 Операнд должен содержать 1 столбец (s), как я могу справиться с этим? Благодаря!! – Tomer

+0

, когда я использую «CONCAT (g.latitude,«, », g.longitude)« он работает, как я могу обойти эту ОШИБКУ? – Tomer

+0

ВЫБОР m.Sequance, m.MainSequenceNum, m.hopAddress, (SELECT g.latitude ОТ 'GeoLiteCity_Oct2011' КАК г ГДЕ g.start_ip_num <= m.hopAddress ORDER BY g.start_ip_num DESC LIMIT 1), (SELECT j.longitude ОТ 'GeoLiteCity_Oct2011' КАК J ГДЕ j.start_ip_num <= m.hopAddress ORDER BY j.start_ip_num DESC LIMIT 1) FROM' trace_3733_3742' AS м ГДЕ m.MainSequenceNum = 5668799415 или m.MainSequenceNum = 5671689631; , который должен сделать это ... но, вероятно, не лучший способ сделать это. – Romain

0

при условии, что start_ip_num имеет уникальный вы можете присоединиться к таблице GeoLiteCity_Oct2011, чтобы получить как lattitude, так и longitude для start_ip_num, выбранных в вашем подзагороде:

SELECT Sequance, MainSequenceNum, hopAddress, latitude, longitude, geo.start_ip_num, 
    (SELECT start_ip_num FROM GeoLiteCity_Oct2011 
    WHERE start_ip_num <= hopAddress 
    ORDER BY start_ip_num DESC LIMIT 1) start_ip 
FROM trace_3733_3742 
JOIN GeoLiteCity_Oct2011 AS geo 
WHERE MainSequenceNum = 5668799415 or MainSequenceNum = 5671689631 
HAVING geo.start_ip_num = start_ip; 
Смежные вопросы