Проблема в запросе PostgreSQL (группировка по и наличие проблемы) - PullRequest
0 голосов
/ 07 июля 2011

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

  • пользователи (идентификатор, имя, адрес электронной почты)
  • комментарии (идентификатор, идентификатор, комментарий, дата, время)

IЯ пытаюсь перечислить всех пользователей и их комментарии, что довольно легко сделать с помощью внутреннего соединения.Тем не менее, я получаю различные комментарии для каждого пользователя, так как я присоединился к результату.Я просто хочу их последний комментарий.Есть идеи?:)

Ответы [ 5 ]

2 голосов
/ 08 июля 2011

это должно сделать это:

select distinct on(u.name, u.id) *
from comments c, users u
where u.id=c.uid
order by u.name, u.id, c.date desc
1 голос
/ 07 июля 2011

Для PostgreSQL 8.4 +:

SELECT x.*
  FROM (SELECT u.*, c.*,
               ROW_NUMBER() OVER (PARTITION BY u.id 
                                      ORDER BY c.date DESC, c.time DESC) AS rnk
          FROM USERS u
          JOIN COMMENTS c ON c.uid = u.id) x
 WHERE x.rnk = 1
0 голосов
/ 08 июля 2011

OMG Ponies, безусловно, имеет лучший ответ, но вот еще один способ сделать это, без какой-либо расширенной базы данных:

select

u.name,
c.comment,
c.comment_date_time

from users as u
left join comments as c
on c.uid = u.id
and
c.comment_date_time -
(
    select max(c2.comment_date_time)
    from comments as c2
    where c2.uid = u.id
) = 0

В этом примере я объединил ваши столбцы даты и времени в comment_date_time.

0 голосов
/ 08 июля 2011

Предполагая, что идентификатором комментария является автоинкремент, найдите максимальный комментарий для пользователя (последний комментарий)

SELECT u.id, u.name, u.email, c.id, c.uid, c.comment, c.date, c.time
FROM users u
JOIN comments c ON u.id = c.uid
JOIN 
    (
        select uid, max(id) id
        from comments
        group by uid
    ) as c2 ON c.id = c2.id AND c.uid = c2.uid
0 голосов
/ 07 июля 2011

Это может сработать:

EDIT:

Я обновил запрос к этому:

SELECT u.id, u.name, u.email, t.id, t.uid, t.comment, t.date, t.time
FROM users u
LEFT OUTER JOIN
(
    select c.id, m.uid, c.comment, m.cdate, c.time
    from comments c
    right outer join 
        (
            select uid, max(date) as cdate
            from comments 
            group by uid
        ) as m
    ON c.cdate = m.cdate
) t
ON u.id = t.uid
...