2013-04-17 87 views
0

我工作的一個項目,我被困在查詢時選擇最大值:SQL如何比較2個SQL表

我想創建某種基於無線網絡連接的GPS。 有2個表格(用戶和位置),我需要把結果放在第三個表格中。

第一個表格是發送來自用戶電話的信息的地方。

具有信號強度的電話MAC地址和無線接入點MAC。用戶手機可以看到多個無線接入點。

第二個表格是存儲所有已知無線接入點及其座標(經度和緯度)的地方。

下面是表:

Users

| PhoneMac | apMac  | signal | 
| user1  |11:11:11  |  20 | 
| user1  |22:22:22  |  80 | 
| user1  |33:33:33  |  50 | 
| user1  |55:55:55  |  99 | 
| user2  |11:11:11  |  60 | 
| user3  |44:44:44  |  10 | 
| user3  |11:11:11  |  90 | 

Locations表:

| apMac   | Lat  | Lon  | 
| 11:11:11  |10.000  |30.000  | 
| 33:33:33  |30.000  |30.000  | 
| 44:44:44  |40.000  |40.000  | 

我需要一個查詢,從Users表需要apMac,檢查它們是否在Locations表並從那些發現的選擇信號最強的那個。

所以結果應該是PhoneMac和所選AP的座標。它應該與每個用戶一起完成。

使用上面這個表應該是正確的結果:

| PhoneMac  |  Lat  |  Lon  | 
| user1  |30.000  |30.000   | 
| user2  |10.000  |10.000   | 
| user3  |10.000  |10.000   | 

    sql = "SELECT t1.PhoneMac, t1.apMac, t1.signal, t2.apMac, t2.lat, t2.lon, 
    COUNT(t1.MacTel) AS num 
    FROM users t1 
    INNER JOIN locations t2 
    ON t1.apMac=t2.apMac 
    GROUP BY t1.PhoneMac 
    ORDER BY num DESC"; 

這是我到目前爲止的代碼。我不知道如何包含關於選擇apMac信號最強的部分,因爲現在它只返回列表中的第一個apMac

+0

這是什麼數據庫系統? * SQL *只是查詢語言 - 不是數據庫產品... –

回答

0

在大多數數據庫中,使用row_number()可以這樣做:

select PhoneMac, lat, long 
from (select u.PhoneMac, l.lat, l.long, 
      ROW_NUMBER() over (partition by u.apMac order by signal desc) as seqnum 
     from users u join 
      locations l 
      on u.apMac = l.apMac 
    ) t 
where seqnum = 1; 

在MySQL或Access或不支持ANSI標準row_number()一些其他的數據庫,你可以用相關子查詢做到這一點。這裏是一種方法:

select distinct PhoneMac, 
     (select lat from Locations l where l.apMac = u.apMac order by signal limit 1) as lat, 
     (select lon from Locations l where l.apMac = u.apMac order by signal limit 1) as long 
from users u