2014-10-22 2 views
0

Имея немного проблем, понимая все, кроме самых простых концепций объединения. Диаграммы не очень помогают.Получение наивысшего значения столбца из объединенной таблицы

У меня есть три таблицы, которые я хочу присоединиться:

  • среды,
  • сессий и
  • журналы

Вот некоторые скриншоты таблиц.

Среды:

Environments

Sessions:

Sessions

Журналы:

Logs

Я хочу, чтобы выбрать столбцы ENVIR onments.envCode и logs.type. Я хочу получить logs.type из последнего журнала для каждой среды. Среды и журналы связаны через сеанс по средам .envCode в сеансах и session.sessionID в журналах.

Я пробовал несколько способов опросить это, но просто не могу понять, как это правильно. Это один из способов, я пытался сделать это:

SELECT environments.envCode 
     ,logs.type 
     FROM environments 
     LEFT JOIN session 
     ON environments.envCode = session.envCode 
     LEFT JOIN logs 
     ON session.sessionID = logs.sessionID 
     WHERE logs.logID = (SELECT MAX(logID) FROM logs); 

Что я получаю сейчас один результат, только строки с наибольшим LOGID из бревен. Имеет смысл, я понимаю, почему это не дает мне результаты, которые я ищу, но я все еще не уверен, как добиться результатов, которые я хочу.

+1

Вы упомянули, что у вас возникли проблемы с пониманием базовых понятий Join, поэтому вот [полезный учебник] (http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/), который оказался полезным мне. Я надеюсь, что это помогает. :) – consuela

+0

Спасибо! Я сейчас посмотрю. – vanamerongen

+2

Кто-нибудь может объяснить, что такое downvotes? Я думаю, что вопрос хорошо написан; мы знаем dbms, мы видим таблицы и данные, мы видим, что некоторые усилия были сделаны. Так почему же кто-то занижает это? Ну, +1 от меня за компенсацию :-) –

ответ

2

Вы хотите только те записи, в которых результат не позднее запись в журнале не СУЩЕСТВУЕТ для окружающей среды:

select 
    environments.envcode, 
    logs.type 
from environments 
left join session on environments.envcode = session.envcode 
left join logs on session.sessionid = logs.sessionid 
where not exists 
(
    select * 
    from sessions later_session 
    join logs later_log on later_log.sessionid = later_session.sessionid 
    where later_session.envcode = session.envcode 
    and later_log.created > logs.created 
); 

EDIT: Я изменил выше запроса, так что последние журналы, а не последние сессии, выбран.

+0

Нет, теперь я получаю несколько результатов для каждой среды. Я хочу получить * один * результат для каждой из сред, показывая только тип журнала для последнего добавленного * журнала * (есть несколько журналов за сеанс, а logID - автоматически инкрементный). – vanamerongen

+0

Итак, как вы знаете, что такое * последний * журнал? Нет даты регистрации, не так ли? Вы полагаетесь на заказ логина? –

+0

Я нахожусь в этом месте, но у него также есть созданный столбец datetime, поэтому, вероятно, лучше использовать его ... Все еще не решает проблему, что я хочу только выбрать последний журнал для каждой среды. – vanamerongen

Смежные вопросы