V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
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
xuyl
V2EX  ›  MySQL

简单的 sql 查询问题,求教

  •  
  •   xuyl · Jun 13, 2015 · 4444 views
    This topic created in 3973 days ago, the information mentioned may be changed or developed.

    表如下:

    score

    id | name | sex | score|

    1 | tony | man | 80 |

    2 | lily | woman | 90 |


    3 | lucy | woman | 85 |


    4 | andy | man | 95 |


    要查出man和woman的最高分,如下


    sex | name | score |


    man | andy | 95 |


    woman | lily | 90 |


    select 语句怎么写?
    我是菜鸟,只会写这样 select sex,max(score) as score from score group by score; 能否不用子查询就把name也查出来?

    21 replies    2015-06-13 22:30:29 +08:00
    Cee
        1
    Cee  
       Jun 13, 2015
    SELECT name, sex, max(score) AS score FROM score GROUP BY sex;
    xuyl
        2
    xuyl  
    OP
       Jun 13, 2015
    @Cee group by是对sex聚合分组,这样取出来的name是不对应score的。
    caigaopei
        3
    caigaopei  
       Jun 13, 2015
    select name, sex ,max(score) from score group by sex;
    +------+-------+------------+
    | name | sex | score |
    +------+-------+------------+
    | tony | man | 95 |
    | lily | woman| 90 |
    +------+-------+------------+
    xuyl
        4
    xuyl  
    OP
       Jun 13, 2015
    @caigaopei 你看一下结果,tony是错的,应该是andy
    Gonster
        5
    Gonster  
       Jun 13, 2015
    >.<要不按分数排个序
    staticor
        6
    staticor  
       Jun 13, 2015
    groupby max取得 socre + id+ sex, 再join 添加上name.
    Cee
        7
    Cee  
       Jun 13, 2015
    @xuyl 嗯,那還是做個子查詢或者 Join 好了
    caigaopei
        8
    caigaopei  
       Jun 13, 2015
    @xuyl select name,sex,max(score) from score group by name LIMIT 0,2; 这个笨办法不知道可行不..

    +------+-------+------------+
    | name | sex | max(score) |
    +------+-------+------------+
    | andy | man | 95 |
    | lily | woman | 90 |
    +------+-------+------------+
    caigaopei
        9
    caigaopei  
       Jun 13, 2015
    @xuyl 好像还是不对.. 菜鸟飘过...
    feiyuanqiu
        10
    feiyuanqiu  
       Jun 13, 2015
    跟这个问题类似,可以直接参考这里 8L 的回答:

    https://www.v2ex.com/t/193875
    liboyue
        11
    liboyue  
       Jun 13, 2015 via Android
    这样行不?
    select name, max(score) from score where sex = man
    cha1
        12
    cha1  
       Jun 13, 2015
    我的笨方法:
    SELECT name, sex, max(score) AS score FROM score WHERE sex = man
    UNION
    SELECT name, sex, max(score) AS score FROM score WHERE sex = womon;
    bin456789
        13
    bin456789  
       Jun 13, 2015
    我也有个笨方法
    在mssql上可用

    SELECT *
    FROM ( SELECT TOP 1
    Sex ,
    Name ,
    Score
    FROM dbo.Score
    WHERE Sex = 'man'
    ORDER BY Score DESC
    ) AS t1
    UNION ALL
    SELECT *
    FROM ( SELECT TOP 1
    Sex ,
    Name ,
    Score
    FROM dbo.Score
    WHERE Sex = 'woman'
    ORDER BY Score DESC
    ) AS t2;

    Sex Name Score
    -------------------------------------------------- -------------------------------------------------- -----------
    man andy 95
    woman lily 90
    bin456789
        14
    bin456789  
       Jun 13, 2015
    找到一个更好的查询方法,请自己翻译到mysql中
    SELECT *
    FROM ( SELECT * ,
    RANK() OVER ( PARTITION BY Sex ORDER BY Score DESC ) AS rank
    FROM dbo.Score
    ) AS t
    WHERE t.rank = 1;
    kid813
        15
    kid813  
       Jun 13, 2015 via iPhone
    在SELECT语句中,所有不出现在聚合函数(MAX)的列名都必须出现在GROUP BY中。

    但是写GROUP BY name显然不是想要的结果,所以应该只能写子查询。
    bigfella
        16
    bigfella  
       Jun 13, 2015
    子查询可行~ 笨方法
    select name, sex, score from Score where score in (select max(score) from Score group by sex )
    bin456789
        17
    bin456789  
       Jun 13, 2015
    @bigfella 如果第二高分的男生跟第一高分的女生同分,那结果就有误了
    lilydjwg
        18
    lilydjwg  
       Jun 13, 2015
    @zqhong 我也是这么想的~
    ETiV
        19
    ETiV  
       Jun 13, 2015 via iPhone
    这标题起的太误导人了……

    MySQL 就没有能解决这类问题的“简单的SQL语句”
    omengye
        20
    omengye  
       Jun 13, 2015
    还是来比一比办法笨好了
    SELECT
    s1.sex,
    s2.NAME,
    s1.score
    FROM
    (
    SELECT
    sex,
    max(score) AS score
    FROM
    score
    GROUP BY
    sex
    ) s1
    LEFT JOIN score s2 ON s1.score = s2.score
    ORDER BY s1.score DESC
    bigfella
        21
    bigfella  
       Jun 13, 2015
    @bin456789 摁~ 没想到, 改了下, 加了性别的条件,应该差不错吧
    select * from (select t.sex, max(t.score) as score from score t group by sex) aa, score bb where bb.sex = aa.sex and bb.score = aa.score
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1015 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 22:09 · PVG 06:09 · LAX 15:09 · JFK 18:09
    ♥ Do have faith in what you're doing.