|
|
|
| Есть три таблицы связанные между собой по 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 использовать бы очень не хотелось, таблица довольно большая. | |
|
|
|
|
|
|
|
для: Orantius
(08.05.2009 в 14:03)
| | ну допустим неоднозначность таблицы ap_history Вы устраните путем выбора max(ap_hist_id)
А с неоднозначностью таблицы ap_info как быть? | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2009 в 14:16)
| | В ap_info нет повторяющихся элементов. Одному id соответсвetn адин ap_id и так далее | |
|
|
|
|
|
|
|
для: Orantius
(08.05.2009 в 14:25)
| | Было б так - ap_id являлся бы первичным ключом. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2009 в 14:39)
| | Я где-то туплю? Если так то не могли бы объяснить? насколько я вижу ip_ad является первичным ключем в ap_info. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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. Так и надо было или была какая-то задумка которую я не понял. Все вроде работает. Сейчас еще по тестирую. Но алгоритм я уже понял.
Огромное спасибо за помощь! | |
|
|
|
|
|
|
|
для: Orantius
(08.05.2009 в 15:49)
| | ah и ai - алиасы . Проще читать код, когда префиксы таблиц короткие.
Конечно, это субъективно. Работать должно было и так и эдак. | |
|
|
|
|
|
|
|
для: Trianon
(08.05.2009 в 15:52)
| | Trianon, еще раз спасибо за пояснение. | |
|
|
|