我正在用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
它为我提供了独特/唯一的记录,但我无法访问详细信息列,我想显示时间戳。
非常感谢任何帮助。
由于
尼克
答案 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在第二个查询中检索您需要的详细信息。我知道它的两个查询,但它最终可能比一个大型复杂查询更快。