加入两个表,然后拉出Distinct Records

时间:2011-07-19 20:27:43

标签: sql join

我正在用C#编写一个VS 2010程序,我在SQL中遇到了一个SELECT语句,这让我很想弄清楚并且可以使用一些帮助。

Table 1 - mailfiles
id,fname,lname,etc...

Table 2 - details,
id,timestamp,page_id,mailfile_id(FK),campaign_id

我想拉出按最新时间戳排序的唯一/不同的mailfile_id,然后将它们连接到mailfiles表以获取我的其余信息。

我有类似的东西,

SELECT mailfiles.id,mailfiles.fname,mailfiles.lname,mailfiles.company2,mailfiles.city,etc...
FROM mailfiles
JOIN
(SELECT DISTINCT(details.mailfile_id)
FROM details
GROUP BY details.mailfile_id) as TMP
ON mailfiles.id = TMP.mailfile_id
ORDER BY TMP.mailfile_id DESC 

它为我提供了独特/唯一的记录,但我无法访问详细信息列,我想显示时间戳。

非常感谢任何帮助。

由于

尼克

3 个答案:

答案 0 :(得分:1)

怎么样:

SELECT * 
FROM
(SELECT mailfile_id, Max(timestamp) m_timestamp FROM details GROUP BY mailfile_id) AS latest
INNER JOIN details on latest.mailfile_id = details.mailfile_id AND latest.m_timestamp = details.timestamp
INNER JOIN mailfiles ON mailfiles.id = details.mailfile_id
ORDER BY details.timestamp

在存在两个相同的时间戳的情况下存在未解决的歧义,但似乎在任何情况下都必须解决这个问题。对于给定的id,这两个时间戳中的哪一个实际上是最新的?

答案 1 :(得分:0)

SELECT MAX (timestamp), fname, lname, ...
FROM mailfiles m, details d
WHERE m.id. = d.mailfiles_id 
GROUP BY m.id, fname, lname, ...

嗯 - 是的,我发现问题正在上升 - 你需要的不仅仅是详细信息的时间戳吗?然后它变得更加棘手。

SELECT m.*, d.* 
FROM mailfiles m, details d 
WHERE m.id = d.mailfiles_id 
  AND (d.mailfiles_id, d.timestamp) IN (
    SELECT mailfiles_id, MAX (timestamp) 
    FROM details 
    GROUP BY mailfiles_id);

如果您需要两个表格的详细信息。

我不知道您的数据库是否支持... and (a, b) in (SELECT c, d FROM ...; postgresql确实。

答案 2 :(得分:0)

我担心你想要做的事情非常棘手,因为你发现不同的运算符适用于你在查询中列出的所有字段。如果它适用于您,您可以使用第一个查询返回ID列表,然后使用这些ID在第二个查询中检索您需要的详细信息。我知道它的两个查询,但它最终可能比一个大型复杂查询更快。