› 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 · 4873 views
    This topic created in 4121 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   ·   Privacy   ·   Solana   ·   1099 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 17:55 · PVG 01:55 · LAX 10:55 · JFK 13:55
    ♥ Do have faith in what you're doing.