2015-05-24 53 views
0

我有一個stop表,找到停止名後我想查找這個名字的前後數據name, lat, longi在mysql中查找前後原始

CREATE TABLE IF NOT EXISTS stops 
stop_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name varchar(30) NOT NULL, 
lat double(10,6) NOT NULL, 
longi double(10,6)NOT NULL) 

enter image description here

例如,如果名稱是TEST我想ABC和天空的名稱,經緯度和隆基。它應該甚至工作時有stop_id之間的差異2,5,7,12

我欣賞任何幫助。

回答

1

您可以使用變量來實現你想要什麼:

SELECT stop_id, name, lat, longi, rn 
FROM (
    SELECT stop_id, name, lat, longi, 
      @r:[email protected]+1 AS rn 
    FROM stops, (SELECT @r:=0) var 
    ORDER BY stop_id, name) s 
WHERE name != 'TEST' AND 
     rn >= (SELECT row_number 
      FROM (
       SELECT name, @row_number:[email protected]_number+1 AS row_number 
       FROM stops, (SELECT @row_number:=0) var 
       ORDER BY stop_id, name) s 
       WHERE name = 'TEST') - 1  
ORDER BY stop_id LIMIT 2 

Demo here

這查詢:

SELECT name, @row_number:[email protected]_number+1 AS row_number 
FROM stops, (SELECT @row_number:=0) var 
ORDER BY stop_id, name 

被用來模擬ROW_NUMBER窗口函數在MySQL中不可用。使用它我們可以識別具有name = 'TEST'的記錄的「行號」,並使用此信息獲取我們想要的記錄。

+0

這是一個錯誤,但現在當我執行它'上面的演示在這裏'的第一個塊時,我只得到前一個,而不是之後呢? –

+0

@TheTime您的意思是* first block *? –

+0

我的意思是這個以'SELECT stop_id,name,lat,longi,rn'開始的塊,而不是以'SELECT name,@row_number:= @ row_number + 1 AS row_number'開頭的第二個塊。 –

1

你可以使用相關子查詢的前面和後面的站的ID,假設這些都是與相鄰的ID的那些:

select s.*, 
     (select s2.stop_id 
     from stops s2 
     where s2.stop_id < s.stop_id 
     order by s2.stop_id desc 
     limit 1 
     ) as prev_stop_id, 
     (select s2.stop_id 
     from stops s2 
     where s2.stop_id > s.stop_id 
     order by s2.stop_id ASC 
     limit 1 
     ) as next_stop_id 
from stops s; 

然後可以使用join在附加信息帶來。

這是很有誘惑力的使用join S表示獲得上/下一個站,如:

select s.*, prevstop.* 
from stops s left join 
    stops prevstop 
    on s.stop_id = prevstop.stop_id + 1; 

然而,這種假設存在的價值沒有間隙,並且這種假設可能不是真的。

0

爲@戈登 - Linoff提到自加入是一個很好的技巧來實現:

SELECT ss . * , nex.stop_id AS nex_id, nex.name AS nex_name, nex.lat AS nex_lat, nex.longi AS nex_longi 
FROM (
    SELECT s . * , pre.stop_id AS pre_id, pre.name AS pre_name, pre.lat AS pre_lat, pre.longi AS pre_longi 
    FROM stops s 
    LEFT JOIN stops pre ON s.stop_id = pre.stop_id + 1) AS ss 
LEFT JOIN stops nex ON ss.stop_id = nex.stop_id - 1 
WHERE (ss.name LIKE 'TEST') 
LIMIT 1