2013-04-17 59 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