AKAPE
Новичок
Выборка из 3 таблиц, подзапросы и алиасы
Здравствуйте. Есть 3 таблицы, в одной хранится общее описание судовой роли, во-второй - конкретные люди, которые связаны по ключу с прошлой таблицей. Втртьей имеем всего лишь датуи новый ранг (если в течении рейса человек повышается по-должности). Люди прибывают и убывают постоянно, нужно вывести список всех, кто сейчас на борту и ЕСЛИ дата продвижения больше даты захода на судно - то вывести это. Имеем запрос:
[SQL]
SELECT
g1.date_event AS `last_sign_on`, MAX(p.date) AS `promo_date`, p.rank AS `promo_rank`,
(
SELECT g2.date_event
FROM `crewlist_general` g2, `crewlist_members` m2
WHERE m2.clid=g2.id
AND g2.status='e'
AND g2.vessel_id=g1.vessel_id
AND g2.event='d'
AND m2.userid=m1.userid
ORDER BY g2.date_event DESC
LIMIT 1
) AS `last_sign_off`,
m1.*
FROM `crewlist_general` g1, `crewlist_members` m1
LEFT JOIN `crewlist_promotions` p
ON (p.userid=m1.userid AND p.date>last_sign_on )
WHERE
m1.clid=g1.id
AND g1.status='e'
AND g1.vessel_id=1
AND g1.event='a'
GROUP BY m1.userid HAVING (`last_sign_off` IS NULL OR `last_sign_on`>`last_sign_off`)
ORDER BY g1.date_event DESC
[/SQL]
Лучше увы так и не придумал. Болдом выделил проблемное место. Понял, что алиасы использовать нельзя в условиях, пробовал просто обращаться к g1.date_event - не работает
Здравствуйте. Есть 3 таблицы, в одной хранится общее описание судовой роли, во-второй - конкретные люди, которые связаны по ключу с прошлой таблицей. Втртьей имеем всего лишь датуи новый ранг (если в течении рейса человек повышается по-должности). Люди прибывают и убывают постоянно, нужно вывести список всех, кто сейчас на борту и ЕСЛИ дата продвижения больше даты захода на судно - то вывести это. Имеем запрос:
[SQL]
SELECT
g1.date_event AS `last_sign_on`, MAX(p.date) AS `promo_date`, p.rank AS `promo_rank`,
(
SELECT g2.date_event
FROM `crewlist_general` g2, `crewlist_members` m2
WHERE m2.clid=g2.id
AND g2.status='e'
AND g2.vessel_id=g1.vessel_id
AND g2.event='d'
AND m2.userid=m1.userid
ORDER BY g2.date_event DESC
LIMIT 1
) AS `last_sign_off`,
m1.*
FROM `crewlist_general` g1, `crewlist_members` m1
LEFT JOIN `crewlist_promotions` p
ON (p.userid=m1.userid AND p.date>last_sign_on )
WHERE
m1.clid=g1.id
AND g1.status='e'
AND g1.vessel_id=1
AND g1.event='a'
GROUP BY m1.userid HAVING (`last_sign_off` IS NULL OR `last_sign_on`>`last_sign_off`)
ORDER BY g1.date_event DESC
[/SQL]
Лучше увы так и не придумал. Болдом выделил проблемное место. Понял, что алиасы использовать нельзя в условиях, пробовал просто обращаться к g1.date_event - не работает