Как получить строки формы таблицы, чтобы каждое письмо появлялось один раз - PullRequest
1 голос
/ 28 февраля 2012

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

select *
from persons p2, (
SELECT p.id,p.name,p.email
FROM persons p, emails e
WHERE p.id = e.person_id
) a
where a.email = p2.email

Этот запрос возвращает список всех электронных писем, отправленных лицам.

Может ли кто-нибудь помочь мне с этим запросом, запрос должен вернуть список людей с электронными письмами, но каждое письмо должно появляться один раз.

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Попробуйте этот вариант:

select p.*, tmp.email
  from persons p, (select person_id, email
                     from emails e1
                    where not exists (
                          select 1
                            from emails e2
                           where e1.person_id = e2.person_id
                             and e1.time_sent < e2.time_sent)) tmp
 where p.id = tmp.person_id;
0 голосов
/ 28 февраля 2012

Как насчет этого?

select *
from persons, (SELECT p.id, m.mail, max(m.time_sent) 
               from persons as p, emails as m 
               where m.mail = p.mail
               GROUP BY p.id, m.mail) as a
where persons.id = a.id
0 голосов
/ 28 февраля 2012

Если ваша СУБД поддерживает ctes, вы можете сделать что-то вроде этого:

;WITH CTE
AS
(
SELECT
    RANK() OVER(PARTITION BY person_id ORDER BY time_sent DESC) AS iRank,
    e.email,
    e.person_id
FROM
    email AS e
)
SELECT
    *
FROM
    persons AS p
    LEFT JOIN CTE
        ON p.id=CTE.person_id
        AND CTE.iRank=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...