zoukankan      html  css  js  c++  java
  • mysql 分组查询

    一、表结构

    --
    --
    表的结构 `client_status`
    --

    CREATE TABLE IF NOT EXISTS `client_status` (
    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
    `client_id` mediumint(8) unsigned NOT NULL,
    `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    )

    --
    --
    转存表中的数据 `client_status`
    --

    INSERT INTO `client_status` (`id`, `client_id`, `addtime`) VALUES
    (3, 1, '2012-03-26 10:32:30'),
    (4, 1, '2012-03-26 10:30:31'),
    (5, 1, '2012-03-26 10:30:32'),
    (6, 2, '2012-03-26 10:30:33'),
    (7, 2, '2012-03-26 10:30:34'),
    (8, 4, '2012-03-26 10:30:35'),
    (9, 4, '2012-03-26 10:30:36'),
    (10, 3, '2012-03-26 10:30:37'),
    (11, 3, '2012-03-26 10:30:38');

    二、目的

    按client_id分组,查询每个client_id中离目前时间最近的记录。

    查询结果示意

    idclient_idaddtime
    3 1 2012-03-26 10:32:30
    7 2 2012-03-26 10:30:34
    11 3 2012-03-26 10:30:38
    9 4 2012-03-26 10:30:36

    三、解决方案

    方案1:

    SELECT * FROM (SELECT * FROM client_status ORDER BY addtime DESC )a GROUP BY client_id
    explain分析
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1 PRIMARY <derived2> ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
    2 DERIVED client_status ALL NULL NULL NULL NULL 9 Using filesort

    方案2:

    SELECT * FROM client_status a WHERE NOT EXISTS (SELECT 1 FROM client_status WHERE a.client_id = client_id AND a.addtime < addtime)
    explain分析
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1 PRIMARY a ALL NULL NULL NULL NULL 9 Using where
    2 DEPENDENT SUBQUERY client_status ref client_id client_id 3 pdmon.a.client_id 1 Using where

    方案3:

    SELECT * FROM `client_status` WHERE addtime IN (SELECT max( addtime ) FROM client_status GROUP BY client_id )
    explain分析
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1 PRIMARY client_status ALL NULL NULL NULL NULL 9 Using where
    2 DEPENDENT SUBQUERY client_status index NULL client_id 3 NULL 1  


    如果有更高效的SQL,欢迎回复!

  • 相关阅读:
    min_25筛入门
    [湖南集训]更为厉害/谈笑风生
    [ARC060D] 最良表現
    [CQOI2007]矩形
    [SCOI2009]粉刷匠
    PAT乙级1030
    PAT乙级1028
    PAT乙级1029
    PAT乙级1026
    PAT乙级1027
  • 原文地址:https://www.cnblogs.com/mybest/p/2418200.html
Copyright © 2011-2022 走看看