2012-02-28 87 views
1

我很难从表格中获取正确的行。 我试图通过查找电子邮件来获取一些行,并且我想获取发送给他们的最后一封电子邮件。 我的查询是:如何获得每行一次显示电子邮件的表格的表格

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 

该查询返回所有发送到个人电子邮件的列表。

有人可以帮助我这个查询,查询需要返回带有电子邮件的人员列表,但每个电子邮件需要出现一次。

感谢

+2

你如何确定哪个邮件是最后一个? – 2012-02-28 09:49:45

+0

发送最后一封电子邮件 – Ofer 2012-02-28 09:54:59

+0

好的,根据您确定它是最后一封电子邮件是什么? – 2012-02-28 09:57:19

回答

2

试试这个变种:

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

如果DBMS支持热膨胀系数,你可以做这样的事情:

;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 
0

这个怎么样?

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