› 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
liquorppp
V2EX  ›  MySQL

构建 SQL 查询语句的疑问

  •  
  •   liquorppp · Dec 29, 2020 · 3627 views
    This topic created in 2098 days ago, the information mentioned may be changed or developed.
    表 t:
    字段 A 字段 B 字段 C ;
    根据 C 字段进行分组,筛选出 B 字段最小的那一行,实现查询结果为不同 C 中最小的 B 的行的 A 字段集合。
    有大佬有解决方案吗
    Supplement 1  ·  Dec 30, 2020
    实际场景是:
    表 SKU
    uuid
    salePrice 售价
    spuId SPUuuid
    spuId 可能为空,查询出所有 SKU,如果 spuId 不为空,则取售价最低的那一条
    14 replies  •  2020-12-30 20:35:20 +08:00
    l00t
        1
    l00t  
       Dec 29, 2020
    看不懂……
    wanv1171
        2
    wanv1171  
       Dec 29, 2020
    先进行分组,然后用 over 选出每组最小的 B 。然后重新根据这个结果筛选 C IN (SELECT C) AND B IN (SELECT B),然后 GROUP BY C, GROUP_CONCAT(A)
    wanv1171
        3
    wanv1171  
       Dec 29, 2020 via iPhone
    @wanv1171 应该是 group by C, B

    第一步 over 之后应该也可以直接 group by
    venhal
        4
    venhal  
       Dec 29, 2020
    可以了解一下开窗函数,用 row_number()over()应该就可以满足
    venhal
        5
    venhal  
       Dec 29, 2020
    不过低版本的 mysql 好像不支持开窗函数,如果不支持的话
    select
    t1.a, t2.b, t2.c
    from
    t1
    join
    (select c, min(b) as b
    from t
    group by c) as t2 ON t1.c = t2.c AND t1.b = t2.b
    lybcyd
        6
    lybcyd  
       Dec 30, 2020 via Android
    子查询吧,先用 c 分组,用 min 函数查出最小的 b 值,作为一个表 x,然后再查询大表中 b 和 c 等于 x 中 b 和 c 的记录
    zhuangjia
        7
    zhuangjia  
       Dec 30, 2020
    @l00t 换成实例:成绩表 t 中存储字段
    A:学生 id,
    B : 成绩,
    C:科目
    想要查询:每个科目成绩最低的同学的集合
    liquorppp
        8
    liquorppp  
    OP
       Dec 30, 2020
    @zhuangjia 实际场景是:
    表 SKU
    uuid
    salePrice 售价
    spuId SPUuuid
    spuId 可能为空,查询出所有 SKU,如果 spuId 不为空,则取售价最低的那一条
    l00t
        9
    l00t  
       Dec 30, 2020
    两个售价一样低的你打算怎么整。
    weiwenhao
        10
    weiwenhao  
       Dec 30, 2020
    select * from logs INNER JOIN (select MIN(id) as min_id FROM logs GROUP BY user_id) test on `test`.min_id = logs.id

    类似这样?
    ZanderNg
        11
    ZanderNg  
       Dec 30, 2020
    select t1.*
    from (select t.a,
    t.b,
    t.c,
    row_number() over(partition by t.a order by to_number(b)) as rank
    from tgxt.test_a t
    where t.c is not null) t1
    where rank = 1
    liquorppp
        12
    liquorppp  
    OP
       Dec 30, 2020
    @weiwenhao 比较烦的是 min 内的是个价格,而不是类似 id 一样的字段
    liquorppp
        13
    liquorppp  
    OP
       Dec 30, 2020
    @l00t 一样的可以随便取一条
    xdwmxx
        14
    xdwmxx  
       Dec 30, 2020
    select *
    from (select t.A,
    t.B,
    t.C,
    row_number() over(partition by t.C order by t.B) rn
    from TEST_ROW_NUMBER_OVER t)
    where t.B is not null
    and rn = 1;
    这样吗?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2932 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 12:18 · PVG 20:18 · LAX 05:18 · JFK 08:18
    ♥ Do have faith in what you're doing.