2014-01-28 86 views
0

这是我的SQL查询:结合SELECT DISTINCT和ORDER BY

SELECT DISTINCT dest 
    FROM messages 
    WHERE exp = ? 
UNION 
SELECT DISTINCT exp 
    FROM messages 
    WHERE dest = ? 

与此查询,我得到的所有我发送或接收的消息。但在我的表messages,我有一个字段timestamp,我需要,与此查询,按时间戳添加订单...但如何?

+0

如果有多个项目获得的记录顺序,你需要哪些时间戳? – talegna

+0

我只需要用最新的优先订购我的消息 –

+0

您的查询不会返回您发送或接收的所有消息。它会返回所有与之通信的人员,而不会有重复。 –

回答

1
SELECT * 
FROM 
    ( SELECT 
      col1 = dest, 
      col2 = MAX(timestampCol) 
     FROM 
      messages 
     WHERE 
      exp = ? 
     GROUP BY 
      dest 
     UNION 
     SELECT 
      col1 = exp, 
      col2 = MAX(timestampCol) 
     FROM 
      messages 
     WHERE 
      dest= ? 
     GROUP BY 
      exp 
    ) tbl 
ORDER BY col2 

这应该每distinct只返回一行exp/dest虽然我相信这可能可以做到没有工会; GROUP BY只会得到最近的一个。

更新SQL:鉴于有可能在一个记录exp等于在相同或另一个记录一个dest

SELECT 
    CASE WHEN exp = ? THEN dest ELSE exp END AS col1 
    ,MAX(timestampCol) AS col2 
FROM 
    messages 
WHERE 
    exp = ? 
    OR dest = ? 
GROUP BY 
    (CASE WHEN exp = ? THEN dest ELSE exp END) 
ORDER BY 
    MAX(timestampCol) DESC; 

你可能需要考虑增加一些虚拟数据的SQL Fiddle,让用户更好地帮助你。

+0

不知道我需要做什么[col1]和[col2]。 –

+0

'[col1]'和'[col2]'就是我给列给出的名字,因为使用'UNION'它明确了哪些列将被返回。 '[col1]'是你在查询中返回的不同条目,'[col2]'是时间戳列。如果你不想返回时间戳列,你可以'SELECT DISTINCT [col1]'而不是'SELECT *' – talegna

+0

好吧,你的SQL语法有错误^^ Phpmyadmin不喜欢你的[col1 ] –

0
SELECT * 
FROM 
(
SELECT DISTINCT dest AS Column1, timestamp AS Column2 
    FROM messages 
    WHERE exp = ? 
UNION 
SELECT DISTINCT exp AS Column1, timestamp AS Column2 
    FROM messages 
    WHERE dest = ? 
) tbl 
ORDER BY Column2 
+0

不,使用此查询,我可以获得时间戳的所有可能组合... –

2

你可以做到这一点没有一个union

SELECT (case when exp = ? then dest else exp end), timestamp 
FROM messages 
WHERE exp = ? or dest = ?; 

然后得到最新消息,为每个参与者,使用group bydistinct

SELECT (case when exp = ? then dest else exp end) as other, max(timestamp) 
FROM messages 
WHERE exp = ? or dest = ? 
group by (case when exp = ? then dest else exp end) 
order by max(timestamp) desc; 
+0

对于 –

+0

@ClémentAndraud,您的SQL语法错误。 。 。这是一个简单的SQL小提琴,它显示了两者在语法上都是正确的SQL(http://www.sqlfiddle.com/#!2/c72625/2)。这是一个简化的表结构,'0'代替'?'。 –

0

这个查询将帮助您通过时间戳

SELECT tbl.mailId, Max(timestampColumn) MostRecentDate 
FROM 
    (
    SELECT exp AS mailId, Max(timestampCol) AS timestampColumn 
    FROM Employeeatd 
    WHERE dest = ? 
    GROUP BY exp 
UNION 

    SELECT Dept AS abc, Max(timestampCol) AS timestampColumn 
    FROM Employeeatd 
    WHERE exp = ? 
    GROUP BY Dept 
    ) tbl 
GROUP BY mailId 
ORDER BY Max(timestampColumn) desc