2016-07-14 77 views
2

我需要显示来自表(结果)的最后2个结果,结果由几个具有匹配submissionId的行组成,每个提交的行数是未知的,当然,我更喜欢单个查询。MySQL组基于DISTINCT值的多个行

这里是数据库表结构

submissionId  input  value 

    1   name   jay 
    1   phone  123-4567 
    1   email  [email protected] 
    2   name   mo 
    2   age   32 
    3   name   abe 
    3   email  [email protected] 
    4   name   jack 
    4   phone  123-4567 
    4   email  [email protected] 

Desierd结果:

submissionId  input  value 

    3   name   abe 
    3   email  [email protected] 
    4   name   jack 
    4   phone  123-4567 
    4   email  [email protected] 

甚至更​​好,如果我能结合行是这样的:在这里

3   name   abe 3  email  [email protected] 
4   name   jack 4  phone  123-4567   4   email  [email protected] 
+0

通过“最后两个结果”,你是指那些具有最大和次最大的不同'submissionId'值的那些? –

+0

@vkp我想这:SELECT DISTINCT t1.submissionId FROM结果T1 LEFT JOIN结果T2 ON t1.submissionId = t2.submissionId GROUP BY t1.submissionId –

+0

@JohnBollinger是(现在)后来我打算添加日期列并获得2个最新结果 –

回答

2

您可以在from子句中使用limit子查询,因此,典型的方式来写是这样的:

SELECT submissionDate, input, value 
FROM t join 
    (select distinct submissionDate 
     from t 
     order by submissionDate desc 
     limit 2 
    ) sd 
    on t.submissionDate = sd.submissionDate; 
+0

谢谢,稍作修改,按照需要工作。 –

+0

我会尽量记住下次看到类似的问题。 –

2

一个选项是使用子查询来识别最近和最近的submissionId

SELECT submissionId, input, value 
FROM yourTable 
WHERE submissionId >= (SELECT MAX(submissionId) FROM yourTable) - 1 
ORDER BY submissionId 

演示在这里:

SQLFiddle

更新:

如果您submissionId列是一个真正的日期类型,你在你的结果想最近的两个日期设置,那么下面的查询将实现这一点。请注意,WHERE子句中的子查询虽然很丑,却与外部查询无关。这意味着MySQL优化器应该能够弄清楚它只需要运行一次。

SELECT submissionDate, input, value 
FROM yourTable 
WHERE submissionDate >= 
    (SELECT MAX(CASE WHEN submissionDate = (SELECT MAX(submissionDate) FROM yourTable) 
        THEN '1000-01-01' 
        ELSE submissionDate 
       END) FROM yourTable) 
ORDER BY submissionDate 

SQLFiddle

+0

取回此错误:此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查询' –

+0

@MoisheySchwartz我更新了我的答案。 –

+0

您的新查询假定submitId编号没有空白。目前还不清楚这是否是一个安全的假设。无论如何,当OP将其转换为基于时间戳的“最后两个”定义时,这种方法将不起作用,因为他现在在他打算最终做的评论中说。 –

0

这是查询的样子了,所以我可以通过LIMIT,RANGE和id/timestamp得到结果(在Tim和Gordon的帮助下):

SELECT * 
FROM rmyTable t 
JOIN 
(SELECT DISTINCT sd.submissionId 
FROM myTable sd 
WHERE sd.questionId = yourId 
ORDER BY sd.submissionId 
LIMIT 2 
) t2 
ON t.submissionId = t2.submissionId 
WHERE t.formId = yourId 
AND dateTime BETWEEN 0000 AND 1111