Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выборка из 3 таблиц не могу разобраться.
 
 автор: Orantius   (08.05.2009 в 14:03)   письмо автору
 
 

Есть три таблицы связанные между собой по ap_id:

describe ap ;
+--------------+------------------+------+-----+---------+----------------+
| ap_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| ap_city | varchar(20) | NO | MUL | | |
| ap_name | varchar(100) | NO | | | |
| ap_ip | varchar(16) | NO | | | |
| ap_community | varchar(20) | NO | | | |
| ap_freq_lst | varchar(45) | NO | | | |
| ap_email_lst | varchar(255) | NO | | | |
+--------------+------------------+------+-----+---------+----------------+

describe ap_history ;
+-------------+------------------+------+-----+---------+----------------+
| ap_hist_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| ap_mac | varchar(20) | NO | | | |
| ap_pwr | int(10) unsigned | NO | | | |
| ap_freq | int(10) unsigned | NO | | | |
| ap_serial | int(10) unsigned | NO | MUL | | |
| ap_rate | int(10) unsigned | NO | | | |
| ap_chk_date | datetime | NO | MUL | | |
| ap_sys_ver | varchar(45) | NO | | | |
| ap_id | int(10) unsigned | NO | MUL | | |
+-------------+------------------+------+-----+---------+----------------+

describe ap_info ;
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| city | varchar(45) | NO | PRI | | |
| ssid | varchar(45) | NO | PRI | | |
| address | varchar(255) | NO | | | |
| ap_id | int(10) unsigned | NO | PRI | 0 | |
+---------+------------------+------+-----+---------+----------------+

из них нужну сделать выборку по полям: ap_id, ap_city, ap_name, ap_freq_lst, ssid, address, ap_mac, ap_serial. Но в ap_history каждый день заносятся новые данные, нужно получать самые свежие.
Но есть нюанс, по некоторым ap_id данные обновляются каждый день по некоторым нет.

Пришел к такому запросу:

select ap.ap_id, ap_city, ap_name, ap_freq_lst, ssid, address, ap_mac, ap_serial, max(ap_hist_id)
from ap LEFT JOIN ap_info USING(ap_id)
LEFT JOIN ap_history USING(ap_id)
GROUP by ap_id ORDER by ap_city;

Но так как групировка происходит после выборки то я получаю в итоге случайные поля ap_serial и ap_mac а не те которые соответствуют max(ap_hist_id).
Ничего нового в голову не приходит, может быть кто-то сможет что-то посоветовать учитывая что
самый плохой путь с первоначальной сортировкой таблицы ap_history использовать бы очень не хотелось, таблица довольно большая.

  Ответить  
 
 автор: Trianon   (08.05.2009 в 14:16)   письмо автору
 
   для: Orantius   (08.05.2009 в 14:03)
 

ну допустим неоднозначность таблицы ap_history Вы устраните путем выбора max(ap_hist_id)
А с неоднозначностью таблицы ap_info как быть?

  Ответить  
 
 автор: Orantius   (08.05.2009 в 14:25)   письмо автору
 
   для: Trianon   (08.05.2009 в 14:16)
 

В ap_info нет повторяющихся элементов. Одному id соответсвetn адин ap_id и так далее

  Ответить  
 
 автор: Trianon   (08.05.2009 в 14:39)   письмо автору
 
   для: Orantius   (08.05.2009 в 14:25)
 

Было б так - ap_id являлся бы первичным ключом.

  Ответить  
 
 автор: Orantius   (08.05.2009 в 14:50)   письмо автору
 
   для: Trianon   (08.05.2009 в 14:39)
 

Я где-то туплю? Если так то не могли бы объяснить? насколько я вижу ip_ad является первичным ключем в ap_info.

  Ответить  
 
 автор: Trianon   (08.05.2009 в 15:10)   письмо автору
 
   для: Orantius   (08.05.2009 в 14:50)
 

Это я туплю.
Зачем тогда вообще ap_info.id понадобился?



SELECT ap.*, ah.*, ai.* 
  FROM ap 
    LEFT JOIN 
      (SELECT ap_id, max(ap_hist_id) AS mhid 
         FROM ap_history 
         GROUP BY ap_id
      )as t2 ON ap.id= t2.ap_id
    LEFT JOIN ap_history ah ON ah.ap_hist_id = mhid
    LEFT JOIN ap_info ai ON ap.id = ai.ap_id

  Ответить  
 
 автор: Orantius   (08.05.2009 в 15:49)   письмо автору
 
   для: Trianon   (08.05.2009 в 15:10)
 

>Зачем тогда вообще ap_info.id понадобился?

База создавалась не мной и довольно давно поэтому сложно ответить)

А можно по коду попросить небольшие пояснения. Я не большой спец в MYSQL.
Приведу свои соображения, верны они или нет.


(SELECT ap_id, max(ap_hist_id) AS mhid 
         FROM ap_history 
         GROUP BY ap_id
      )as t2 ON ap.id= t2.ap_id


В этом подзапросе мы выдираем максимальные значения ap_hist_id и группируем их по ap_id
Здесь для меня все более менее понятно.

> SELECT ap.*, ah.*, ai.*

Я это заменил на строки которые надо выбрать. Соответственно

>LEFT JOIN ap_history ah ON ah.ap_hist_id = mhid
> LEFT JON ap_info ai ON ap.id = ai.ap_id

Здесь тоже заменил ai и ap. Так и надо было или была какая-то задумка которую я не понял. Все вроде работает. Сейчас еще по тестирую. Но алгоритм я уже понял.
Огромное спасибо за помощь!

  Ответить  
 
 автор: Trianon   (08.05.2009 в 15:52)   письмо автору
 
   для: Orantius   (08.05.2009 в 15:49)
 

ah и ai - алиасы . Проще читать код, когда префиксы таблиц короткие.
Конечно, это субъективно. Работать должно было и так и эдак.

  Ответить  
 
 автор: Orantius   (08.05.2009 в 15:54)   письмо автору
 
   для: Trianon   (08.05.2009 в 15:52)
 

Trianon, еще раз спасибо за пояснение.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования