0

我正在做一个项目,但我被困在一个查询上:

我想创建某种基于 wi-fi 的 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     |  

我需要一个从表中获取 apMac 的查询Users,检查它们是否在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列表中的第一个。

4

1 回答 1

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
于 2013-04-17T17:51:12.290 回答