zoukankan      html  css  js  c++  java
  • mysql 分组排序取最值

    • 查各个用户下单最早的一条记录
    • 查各个用户下单最早的前两条记录
    • 查各个用户第二次下单的记录

    一、建表填数据:

    SET NAMES utf8mb4;
    -- 取消外键约束
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for order_table
    -- ----------------------------
    DROP TABLE IF EXISTS `order_table`;
    CREATE TABLE `order_table` (
      `order_id` int(11) NOT NULL,
      `user_id` int(11) NOT NULL,
      `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`order_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    -- ----------------------------
    -- Records of order_table
    -- ----------------------------
    BEGIN;
    INSERT INTO `order_table` VALUES (1, 1, '2019-03-03 16:29:58');
    INSERT INTO `order_table` VALUES (2, 1, '2019-03-04 16:30:17');
    INSERT INTO `order_table` VALUES (3, 1, '2019-03-05 16:30:29');
    INSERT INTO `order_table` VALUES (4, 2, '2019-03-03 16:35:23');
    INSERT INTO `order_table` VALUES (5, 2, '2019-03-04 16:35:34');
    COMMIT;
    -- 添加外键约束
    SET FOREIGN_KEY_CHECKS = 1;

    二、解决上述三个问题

    1、查各个用户下单最早的一条记录

    select ot.* FROM order_table ot
    where create_time = ( SELECT min(create_time) FROM order_table where user_id = ot.user_id ) order by ot.user_id

    结果:

    2、查各个用户下单最早的前两条记录

    -- 分组最小的前两条
    select * from order_table ot 
    where 2 > (select count(*) from order_table where user_id = ot.user_id and create_time < ot.create_time )
    order by ot.user_id, ot.create_time

    结果:

    3、查各个用户第二次下单的记录

    -- 分组排序,取create_time倒数第二小的数据
    select * FROM (
            -- 按user_id分组、create_time asc排序、取create_time最小和倒数第二小的值
            select * from order_table oot 
            where 2 > (
                    select count(*) 
                    from order_table 
                    where user_id = oot.user_id and create_time < oot.create_time
            )
            order by oot.user_id, oot.create_time
    ) as ttt where
    ttt.order_id not in
    (        -- 按user_id分组、create_time asc排序、取create_time最小的值
            select ot.order_id FROM order_table ot
            where create_time = (
                    SELECT min(create_time) FROM order_table where user_id = ot.user_id
            ) order by ot.user_id
    )

    结果:

    参考链接:http://www.manongjc.com/article/1082.html

  • 相关阅读:
    实战mysql导出中文乱码及phpmyadmin导入中文乱码
    Flex4:利用HttpService与ASP.NET传输JSON数据(登录为例)
    HTML和CSS的关键—盒子模型(Box model)(转载)
    ul,ol,dl区别
    Server Application Error详细解决办法
    信息系统规划(ISP)之BSP
    使用WebDevHelper辅助ASP.NET AJAX程序开发
    RMS 1.0 SP2
    使用IIS Request Viewer查看当前IIS连接
    Multidimensional Analysis 24 Principle
  • 原文地址:https://www.cnblogs.com/shenqidu/p/10478892.html
Copyright © 2011-2022 走看看