Выборка из 3 таблиц, подзапросы и алиасы

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 - не работает :(
 

chira

Новичок
Понял, что алиасы использовать нельзя в условиях, пробовал просто обращаться к g1.date_event - не работает
что заначит не работает? где ошибка?
в других местах алиасы можно использовать? они у тебя повсюду ...
ты бы объяснил какая таблица для чего нужна и что означают поля участвующие в запросе (g1.status, g1.event)
 

AKAPE

Новичок
Автор оригинала: chira
что заначит не работает? где ошибка?
в других местах алиасы можно использовать? они у тебя повсюду ...
ты бы объяснил какая таблица для чего нужна и что означают поля участвующие в запросе (g1.status, g1.event)
g1.status и g1.event - это просто флажки, статус говорит о том предваритльная ли это судю роль или уже исполненная (только исполненная участвует в поиске) g.event =ENUM('a','d')

a- arival
d-departure

Тоесть человек приезжает или уезжает. С LEFT JOIN отказывается работать в условии ON колонка из другой таблицы, нежели той, к которой джойнят. Так же как и их Алиасы. Алиасы под-запроса нельзя использовать ни в к каких условиях кроме ORDER BY, SORT BY, HAVING ...
 

chira

Новичок
запрос нельзя переписать как-нибудь так:
Код:
SELECT 
  g1.date_event AS `last_sign_on` 
 , MAX( p.date ) AS `promo_date` 
 , p.rank AS `promo_rank` 
 , MAX(g2.date_event) `last_sign_off` 
 , m1 . *
FROM `crewlist_general` g1, `crewlist_members` m1
LEFT JOIN `crewlist_promotions` p ON ( p.userid = m1.userid AND p.date > g1.date_event )
LEFT JOIN `crewlist_general` g2 ON
  m1.clid = g2.id AND g2.status = 'e' AND g2.vessel_id = g1.vessel_id AND g2.event = 'd'
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
 

AKAPE

Новичок
В том то и дело, что он не показвает ошибок, но даже не выдает путой рэкордсэт в ответ :( .... все дело в том, что в условии

LEFT JOIN `crewlist_promotions` p ON ( p.userid = m1.userid AND p.date > g1.date_event )

есть третья таблица, к торой p как-бы не джойнится :(
 
Сверху