mysql 获取分组中最新记录SQL写法示例 select group by order by

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.infrastructure.core.version.dao.VersionDAO">
    <select id="batchQueryTopVersionList"
            parameterType="com.xxx.infrastructure.api.version.param.VersionQueryParam"
            resultMap="com.xxx.infrastructure.core.version.dao.base.BaseVersionDAO.ResultMapWithBLOBs">

        select a.* from
        (select * from version WHERE is_deleted = 'n'
        and biz_type = #{versionQueryParam.bizType}
        and domain = #{versionQueryParam.domain}
        <if test="versionQueryParam.bizIdList != null and versionQueryParam.bizIdList.size > 0">
            and biz_id in
            <foreach collection="versionQueryParam.bizIdList" separator="," index="index" open="(" close=")"
                     item="item">
                #{item}
            </foreach>
        </if>
        ) a
        join
        (SELECT
        biz_id,
        history_id,
        max(gmt_create) as gmt_create
        FROM version
        WHERE is_deleted = 'n'
        and biz_type = #{versionQueryParam.bizType}
        and domain = #{versionQueryParam.domain}
        <if test="versionQueryParam.bizIdList != null and versionQueryParam.bizIdList.size > 0">
            and biz_id in
            <foreach collection="versionQueryParam.bizIdList" separator="," index="index" open="(" close=")"
                     item="item">
                #{item}
            </foreach>
        </if>
        group by biz_id) b
        on concat(a.biz_id,a.gmt_create) = concat(b.biz_id,b.gmt_create)
    </select>
</mapper>

I have a mysql statement

SELECT * 
FROM tbl_messages 
WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY date_sent DESC

and it is producing the correct results however they are not in the correct order.

The grouping works well but it record displayed in the group is the first recorded entered into the DB but I would like the latest record to be displayed in each group.

Is there a way to have the latest record displayed for each group?

2011-12-19 12:16:25 This is the first message
2011-12-19 12:18:20 This is the second message
2011-12-19 12:43:04 This is the third message

The group shows 'This is the first message' where I would like 'This is the third message' as that is the most recent record/message.

Cheers.

This may work (but not guaranteed):

SELECT * 
FROM
  ( SELECT *
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC
  ) tmp
GROUP BY from_user_id 
ORDER BY date_sent DESC

This should work:

SELECT t.* 
FROM 
    tbl_messages AS t
  JOIN
    ( SELECT from_user_id 
           , MAX(date_sent) AS max_date_sent
      FROM tbl_messages 
      WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
      GROUP BY from_user_id 
    ) AS tg
    ON  (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent)
ORDER BY t.date_sent DESC

参考资料

https://stackoverflow.com/questions/8556283/mysql-select-group-by-order


Kotlin开发者社区

专注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、"高可用,高性能,高实时"大型分布式系统架构设计主题。

High availability, high performance, high real-time large-scale distributed system architecture design

分布式框架:Zookeeper、分布式中间件框架等
分布式存储:GridFS、FastDFS、TFS、MemCache、redis等
分布式数据库:Cobar、tddl、Amoeba、Mycat
云计算、大数据、AI算法
虚拟化、云原生技术
分布式计算框架:MapReduce、Hadoop、Storm、Flink等
分布式通信机制:Dubbo、RPC调用、共享远程数据、消息队列等
消息队列MQ:Kafka、MetaQ,RocketMQ
怎样打造高可用系统:基于硬件、软件中间件、系统架构等一些典型方案的实现:HAProxy、基于Corosync+Pacemaker的高可用集群套件中间件系统
Mycat架构分布式演进
大数据Join背后的难题:数据、网络、内存和计算能力的矛盾和调和
Java分布式系统中的高性能难题:AIO,NIO,Netty还是自己开发框架?
高性能事件派发机制:线程池模型、Disruptor模型等等。。。

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。不积跬步,无以至千里;不积小流,无以成江河。

<think>好的,我需要解释清楚SQLORDER BYGROUP BY的区别。首先,我得确认自己对这两个子句的理解是否正确。GROUP BY主要用于聚合数据,通常配合聚合函数如SUM、COUNT等使用,将结果集按指定列分组。而ORDER BY则是用来对结果集进行排序的,可以指定升序或降序。 接下来,我需要考虑用户的背景。用户可能是刚开始学习SQL的开发者或数据分析师,需要明确两者的不同使用场景和功能。我应该用简单明了的语言,避免技术术语过多,但也要确保准确性。 要结构清晰,可能需要分点说明每个子句的作用、语法、使用场景,然后对比它们的区别。同时,举例会有助于理解,特别是结合实际的SQL查询例子。 需要注意的是,用户可能容易混淆两者的用途,比如误以为GROUP BY会排序结果,但实际上它只是分组,而排序需要ORDER BY。这一点需要强调。 另外,要确保回答符合之前提到的格式要求,不使用任何Markdown,用自然的中文,口语化,但保持专业性。需要检查是否有遵循系统级指令,比如数学表达式的格式,但在这个问题中可能涉及较少,不过如果有例子中的表达式,要正确使用$...$或$$...$$。 可能需要提到GROUP BY常与HAVING子句一起使用,而ORDER BY则用于最终结果的排序。还要注意GROUP BY可能会影响选择列表中的非聚合列,而ORDER BY则不会改变查询结果的行数,只是调整顺序。 最后,确保回答真实可靠,如果有不确定的地方,比如某些数据库系统的特定行为,可能需要提及不同数据库可能有细微差异,但总体概念一致。</think>在数据库中,`ORDER BY`和`GROUP BY`是两个核心子句,但用途和效果完全不同。以下分步说明它们的区别: --- ### 一、功能区别 1. **`GROUP BY`(分组)** - **核心作用**:将数据按指定列的相同值分组,通常与聚合函数(如`SUM()`、`COUNT()`、`AVG()`等)配合使用。 - **示例**:统计每个部门的员工数量 ```sql SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department; ``` - **结果特点**:输出结果的行数等于分组的数量(例如部门数量)。 2. **`ORDER BY`(排序)** - **核心作用**:对查询结果按指定列排序(升序`ASC`或降序`DESC`)。 - **示例**:按工资从高到低显示员工 ```sql SELECT name, salary FROM employees ORDER BY salary DESC; ``` - **结果特点**:不改变数据内容,仅调整行的顺序。 --- ### 二、执行顺序区别 - **`GROUP BY`** 在数据筛选(`WHERE`)后执行,用于聚合数据。 - **`ORDER BY`** 在所有操作完成后执行,是查询的最后一步。 --- ### 三、典型使用场景 1. **`GROUP BY`适用场景** - 统计汇总数据(如分类计数、求和)。 - 结合`HAVING`对分组结果过滤(例如筛选员工数大于5的部门): ```sql SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 5; ``` 2. **`ORDER BY`适用场景** - 需要有序展示结果(如排行榜、时间排序)。 - 可对多列排序(例如先按部门排序,部门内按工资排序): ```sql SELECT department, name, salary FROM employees ORDER BY department ASC, salary DESC; ``` --- ### 四、常见误区 - **误以为`GROUP BY`会排序结果**: 虽然某些数据库(如MySQL)在`GROUP BY`后可能按分组列排序,但这并非SQL标准行为。若要确保顺序,必须显式使用`ORDER BY`。 - **混淆聚合与非聚合列**: 使用`GROUP BY`时,非聚合列必须在`GROUP BY`子句中列出,否则会报错。例如: ```sql -- 错误写法(name未在GROUP BY中) SELECT department, name, AVG(salary) FROM employees GROUP BY department; -- 正确写法 SELECT department, name, AVG(salary) FROM employees GROUP BY department, name; -- 明确列出所有非聚合列 ``` --- ### 五、总结对比表 | 特性 | `GROUP BY` | `ORDER BY` | |--------------|---------------------------|---------------------------| | **核心功能** | 数据分组与聚合 | 结果排序 | | **是否改变行数** | 是(合并分组行) | 否(仅调整顺序) | | **常见搭配** | `COUNT()`, `SUM()`, `HAVING` | `ASC`, `DESC` | | **执行顺序** | 在`WHERE`后、`HAVING`前 | 整个查询的最后一步 | 通过理解两者差异,可以更精准地编写查询语句,避免逻辑错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI天才研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值