一个 SQL 大家帮忙理解一下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
huzhengnan
V2EX    MySQL

一个 SQL 大家帮忙理解一下

  •  1
     
  •   huzhengnan 2019-07-18 20:36:25 +08:00 5345 次点击
    这是一个创建于 2359 天前的主题,其中的信息可能已经有所发展或是发生改变。

    优化老项目,访问人数不多,数据库 CPU100%,内存 100% 发现 filter 中有这么个 SQL,也不止这么个 SQL,但是这个是我看了比较久的一个

    SELECT a.* FROM user a WHERE a.seller_id = 600000 AND a.user_type = ( SELECT MAX(b.user_type) FROM user b WHERE a.seller_id = b.seller_id GROUP BY seller_id ) GROUP BY seller_id 

    问两个问题

    1. 可以改为什么 SQL
    2. 这么写的思路是什么
    15 条回复    2019-07-19 10:56:00 +08:00
    oaix
        1
    oaix  
       2019-07-18 20:52:23 +08:00
    SELECT a.*
    FROM user a
    WHERE a.seller_id = 600000
    ORDER BY user_type DESC LIMIT 1
    shanYueFengCheng
        2
    shanYueFengCheng  
       2019-07-18 20:57:59 +08:00
    复杂 SQL 分为多次简单查询----《深入理解 Mysql 》

    拆分成两次查询。
    目标表 user 取个用户类型的最大值
    SELECT MAX(user_type) FROM user

    获取用户类型的最大值,userType 和销售者 id sellerId
    SELECT a.* FROM user a WHERE a.seller_id = ? AND a.user_type = ?
    GROUP BY seller_id
    taogen
        3
    taogen  
       2019-07-18 20:58:02 +08:00 via Android
    @oaix 楼上正解。查询某个 seller_id 中 user_type 最大的一行。那个子查询没必要。
    shanYueFengCheng
        4
    shanYueFengCheng  
       2019-07-18 21:01:54 +08:00
    不确定原表设计,不能确定只有一条
    taogen
        5
    taogen  
       2019-07-18 21:05:39 +08:00 via Android
    @shanYueFengCheng 老哥说得对,在下疏忽了。一楼的回答不一定对,要看业务是不是只需要一条数据。
    oaix
        6
    oaix  
       2019-07-18 21:08:15 +08:00
    @taogen 看最后面有个 group by
    jaskle
        7
    jaskle  
       2019-07-18 21:23:51 +08:00 via Android
    无索引的 group by 是锁表利器
    taogen
        8
    taogen  
       2019-07-18 21:37:42 +08:00 via Android
    @oaix 最后的 group by 没看懂,感觉没什么意义,父查询并不需要使用分组对应的函数如 max,min。
    你的 limit 1 感觉不行,如果有多行数据的 user_type = max(user_type) 呢?原结果是多行,你的始终是一行
    txwd
        9
    txwd  
       2019-07-18 21:53:19 +08:00
    据我所知,这个 SQL 执行不了,最后来这个 GROUP BY。代码没贴全?
    akira
        10
    akira  
       2019-07-18 21:56:15 +08:00
    1l 应该就对了. 除非 a 表里面有 usertype 是大于 b 表里面的。

    原 sql 应该也没有太大问题,怀疑 seller_id 没做索引
    oaix
        11
    oaix  
       2019-07-18 21:57:14 +08:00   2
    @taogen #8

    mysql-sql> select * from tbl_test;
    +----+------+------+
    | id | type | name |
    +----+------+------+
    | 1 | 1 | a |
    | 2 | 1 | b |
    | 3 | 2 | c |
    | 4 | 2 | d |
    +----+------+------+
    4 rows in set (0.00 sec)
    mysql-sql> select * from tbl_test where type=2;
    +----+------+------+
    | id | type | name |
    +----+------+------+
    | 3 | 2 | c |
    | 4 | 2 | d |
    +----+------+------+
    2 rows in set (0.00 sec)
    mysql-sql> select * from tbl_test where type=2 group by type;
    +----+-----+------+
    | id | type | name |
    +----+------+------+
    | 3 | 2 | c |
    +----+------+------+
    1 row in set (0.00 sec)
    taogen
        12
    taogen  
       2019-07-18 22:04:02 +08:00 via Android
    @oaix group by 还有这个效果。多谢赐教!
    zjp
        13
    zjp  
       2019-07-18 22:31:30 +08:00   1
    @oaix 有 ONLY_FULL_GROUP_BY 的问题
    +----+------+------+
    | id | type | name |
    +----+------+------+
    | 3 | 2 | c |
    | 4 | 2 | d |
    +----+------+------+
    都满足条件,但是 group by 丢弃了一行
    LeeSeoung
        14
    LeeSeoung  
       2019-07-19 10:19:48 +08:00
    先查 sql 执行时间,找出慢的再优化,不要凭人为感觉哪个 sql 有问题,找到执行慢的 sql 直接看执行计划来进行优化。
    addsionhuey
        15
    addsionhuey  
       2019-07-19 10:56:00 +08:00
    select *
    from (
    SELECT a.*,row_number() over(partition by seller_id order by user_type desc) as ROW_ORDER
    FROM user a
    WHERE a.seller_id = 600000
    )
    where ROW_ORDER = 1
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2539 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 13:36 PVG 21:36 LAX 05:36 JFK 08:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86