2015-07-13 59 views
1

我有一個複雜的查詢返回用戶列表及其詳細信息,並希望根據特定用戶的緯度和經度按距離排序它們。到目前爲止,我設法一方面提取他們的信息,另一方面使用正則表達式對用戶進行排序,但在嘗試了好幾個小時之後,我仍然沒有設法將兩個查詢混合成一個查詢。如何加入2個查詢按位置排序用戶sql

誰會知道該怎麼做?

這裏是我的2個查詢:

/* list of users with their information */ 
SELECT x.* 
    FROM ow_base_user x 
    JOIN ow_base_user y 
    ON y.id = x.id 
    LEFT 
    JOIN ow_base_user_suspend z 
    ON z.userId = y.id 
WHERE z.id IS NULL 
    AND y.emailVerify = 1 
ORDER 
    BY x.joinStamp DESC LIMIT 100 

/* sort users by distance according to user 1 lat and lng */ 
SELECT l.id 
    , l.lat 
    , l.lng 
    , haversine(l.lat,l.lng,u.lat,u.lng)*111.045 distance 
    FROM ow_googlelocation_data u 
    , ow_googlelocation_data l 
WHERE l.entityType = 'user' 
    AND u.id = 1 
ORDER 
    BY distance 

編輯:

這是第一個查詢的輸出: list of users with detail

而第二個查詢: users sorted by distance

我希望將第二個查詢的第一個查詢+距離字段作爲輸出,和所有按距離排序的東西。

編輯2:這裏是虛擬內容表和原始查詢的dump,如果你想嘗試一下

+0

你能提供來自兩個查詢(前5行或其他)的樣本輸出以及你期望輸出的樣子嗎? –

+0

當然,我編輯了我的問題。 –

+0

第二個屏幕截圖不起作用! –

回答

1

試試這個,我一直在改變表的別名成一些更可讀,讓我知道。

SELECT 
    u1.*, 
    loc1.lat, 
    loc1.lng, 
    haversine(loc1.lat,loc1.lng,loc2.lat,loc2.lng)*111.045 as distance 
FROM 
    ow_googlelocation_data as loc2, 
    ow_base_user as u1 INNER JOIN ow_base_user u2 
     ON u1.id = u2.id 
    LEFT JOIN ow_base_user_suspend s 
     ON s.userId = u1.id 
    INNER JOIN ow_googlelocation_data as loc1 
     ON loc1.entityId = u1.id 
WHERE 
    s.id IS NULL AND 
    u1.emailVerify = 1 AND 
    loc1.entityType='user' AND 
    loc2.entityType = 'user' AND 
    u1.id != loc2.entityId AND 
    loc2.entityId = 1 
ORDER BY 
    distance ASC 
LIMIT 100 
+0

正是我想要的,謝謝! –