MySQL 根据 DISTINCT 值对多行进行分组

标签 mysql sql

我需要显示表中的最后2个结果(结果),结果由具有匹配submissionId的多行组成,每次提交的行数未知,当然我更喜欢单个查询。

这是数据库表结构

submissionId     input       value

     1           name         jay
     1           phone        123-4567
     1           email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="601405131420070d01090c4e030f0d" rel="noreferrer noopener nofollow">[email protected]</a> 
     2           name         mo
     2           age          32
     3           name         abe
     3           email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7716151237101a161e1b5914181a" rel="noreferrer noopener nofollow">[email protected]</a>
     4           name         jack
     4           phone        123-4567
     4           email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="573d36343c17303a363e3b7934383a" rel="noreferrer noopener nofollow">[email protected]</a> 

期望的结果:

submissionId     input       value

     3           name         abe
     3           email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="18797a7d587f75797174367b7775" rel="noreferrer noopener nofollow">[email protected]</a>
     4           name         jack
     4           phone        123-4567
     4           email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7e141f1d153e19131f1712501d1113" rel="noreferrer noopener nofollow">[email protected]</a>  

或者更好,如果我可以像这样组合行:

3           name         abe    3       email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1c7d7e795c7b717d7570327f7371" rel="noreferrer noopener nofollow">[email protected]</a>
4           name         jack   4       phone        123-4567         4           email        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6c060d0f072c0b010d0500420f0301" rel="noreferrer noopener nofollow">[email protected]</a> 

最佳答案

这里的一个选项是使用子查询来识别最新的和紧邻最新的 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

关于MySQL 根据 DISTINCT 值对多行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38377612/

相关文章:

mysql - 使用一个外键创建两个表时出现约束错误 MySQL 5.6

mysql - 使用docker进行单元测试

sql - 转换时转义 XML 特殊字符

sql - ORACLE 如何使用带有动态线轴位置的线轴

php - 'field list' php/mySQL 中的未知列,但该字段确实存在。

javascript - Highcharts标签格式化程序来查询mysql?

mysql - 如何使用现有列在表中添加外键而不丢失数据?

mysql - 从一个表中选择信息引用另一个表中的信息

mysql - 我如何在mysql中获得前5名的分数

MySQL:在 GROUP_CONCAT 中用 0 替换 null