2013-12-02 2 views
-2

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

Visit (FromId, ToId, VisitTime) 

где FromId и ToId является FKS к таблице

UserProfile (uid, name, age ...) 

Как пользователь с моей UID Я хочу, чтобы выбрать все профили I посетили или посетили меня в одном результирующем наборе, заказаном VisitTime, и с указанием «направления посещения».

получить данные с помощью этого выбора:

SELECT CASE WHEN a.FromID = 'yourIDHere' 
      THEN c.Name 
      ELSE b.Name 
    END Name, 
    CASE WHEN a.FromID = 'yourIDHere' 
      THEN c.Age 
      ELSE b.Age 
    END Age, 
    a.VisitTime, 
    CASE WHEN a.FromID = 'yourIDHere' 
      THEN 'You' 
      ELSE 'Friend' 
    END DirectionOfVisit 
FROM Visit a 
    INNER JOIN UserProfile b 
     ON a.FromID = b.Uid 
    INNER JOIN UserProfile c 
     ON a.ToID = c.Uid 
WHERE 'yourIDHere' IN (a.FromID, a.ToID) 
ORDER BY a.VisitTime 

Теперь она печатает (псевдо выход)

Jack (id1) | IN |12.12.2012 
Jack (id1) | IN |11.12.2012 
Jack (id1) | IN |11.12.2012 
Jack (id1) | OUT | 13.12.2012 
Jack (id1) | OUT | 12.12.2012 
Michael (id5) | IN | 5.12.2012 
Michael (id5) | OUT | 6.12.2012 
Michael (id5) | OUT | 5.12.2012 

Я хотел бы список, чтобы быть похожим на это:

Jack | IN | 12.12.2012 (the most recent) 
Jack | OUT | 13.12.2012 (the most recent) 
Michael (id5) | IN | 5.12.2012 (the most recent) 
Michael (id5) | OUT | 6.12.2012 (the most recent) 

I знайте, что команда GROUP решит ее, но она слишком сложна для меня (новичок).

+0

можете ли вы включить запрос, который вы выполнили в своем вопросе? – Rossana

+0

См. Ссылку в первой строке моего вопроса - не хотел дублировать ее здесь. Спасибо –

ответ

2

Вы можете использовать GROUP BY вместе с функцией агрегата, чтобы получить результат. Поскольку вам нужна самая последняя дата для каждого name и type (IN/OUT), вы можете использовать функцию агрегации max() в столбце даты. Вы затем использовать GROUP BY на другие столбцы вы хотите вернуть:

Базовый синтаксис будет:

select 
    name, 
    type, 
    max(date) date 
from yourtable 
group by name, type; 

См SQL Fiddle with Demo

Если вы хотите, чтобы вернуть максимальную дату с существующими запрос, вы можете просто расширить запрос использовать:

select name, age, max(VisitTime), DirectionOfVisit 
from 
(
    SELECT CASE WHEN a.FromID = 'yourIDHere' 
       THEN c.Name 
       ELSE b.Name 
     END Name, 
     CASE WHEN a.FromID = 'yourIDHere' 
       THEN c.Age 
       ELSE b.Age 
     END Age, 
     a.VisitTime, 
     CASE WHEN a.FromID = 'yourIDHere' 
       THEN 'You' 
       ELSE 'Friend' 
     END DirectionOfVisit 
    FROM Visit a 
     INNER JOIN UserProfile b 
      ON a.FromID = b.Uid 
     INNER JOIN UserProfile c 
      ON a.ToID = c.Uid 
    WHERE 'yourIDHere' IN (a.FromID, a.ToID) 
) d 
group by name, age, DirectionOfVisit; 

См SQL Fiddle with Demo

+0

Схема включена в связанный вопрос, не хотела дублировать ее здесь. Это сложнее, чем ваш ответ к несчастью. Спасибо. –

+0

@PetrB Здесь вы должны включить все необходимые детали в свой вопрос. Вы должны иметь возможность изменить это в своем существующем запросе, я предлагал решение, демонстрирующее, как вы используете GROUP BY. – Taryn

+0

Вам также нужен заказ by clause. –

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