2013-04-17 2 views
0

я работаю над проектом, и я застрял на запросе:SQL Как выбрать максимальное значение при сравнении 2 SQL таблиц

Я хочу, чтобы создать своего рода GPS на базе Wi-Fi. Есть 2 таблицы (пользователи и местоположения), и мне нужно поместить результаты в третью таблицу.

Первый стол, где отправляется информация с телефонов пользователей.

MAC-адрес и 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 и координаты выбранной точки доступа. Это нужно делать с каждым пользователем.

Используя таблицы выше, это должно быть правильный результат:

| 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 
Смежные вопросы