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

mysql 排序去重 sql 写法

  •  
  •   anai1943 · Oct 21, 2016 · 6085 views
    This topic created in 3635 days ago, the information mentioned may be changed or developed.

    表结构如下

    data_id 主键

    user_id

    data_name

    hits 点击量

    每个用户有多条数据,查询前 8 个用户点击量最多的一条数据,再按照点击量倒序,这个 sql 怎么写,谢谢!

    Supplement 1  ·  Oct 21, 2016
    | data_id | user_id | data_name |hits
    | 1 | 2 | test1 | 140
    | 2 | 2 | test2 | 200
    | 3 | 3 | test2 | 110
    | 4 | 3 | test2 | 10
    | 5 | 1 | test2 | 130
    | 6 | 4 | test2 | 10
    | 7 | 4 | test2 | 100

    假如要查询出来下面的 3 条结果,也就是前 3 条点击量最多的数据, user_id 不能重复

    | data_id | user_id | data_name |hits
    | 2 | 2 | test2 | 200
    | 5 | 1 | test2 | 130
    | 3 | 3 | test2 | 110

    sql 怎么写,再次谢谢!
    Supplement 2  ·  Oct 21, 2016

    感谢 @kfll @akira @Powered

    最终用 @Powered 的写法查询成功,谢谢!

    SELECT
    	t.*
    FROM
    	(
    		SELECT
    			user_id,
    			max(hits) AS max_hits
    		FROM
    			t
    		GROUP BY
    			user_id
    	) t2
    LEFT JOIN t ON t.user_id = t2.user_id
    AND t.hits = t2.max_hits
    ORDER BY
    	t2.max_hits DESC
    LIMIT 3
    
    8 replies  •  2016-10-21 20:08:26 +08:00
    cxbig
        1
    cxbig  
       Oct 21, 2016 via iPhone
    SELECT data_name, count(hits)
    FROM table
    GROUP BY data_name
    ORDER BY count(hits) DESC
    anai1943
        2
    anai1943  
    OP
       Oct 21, 2016
    @cxbig 您看下附言,我想查询的是这样的结果,谢谢!
    lishunan246
        3
    lishunan246  
       Oct 21, 2016
    select distinct
    kfll
        4
    kfll  
       Oct 21, 2016 via iPhone   ❤️ 1
    select * from (select user_id, max(hits) as max_hits from t group by user_id) t2 left join t on t.user_id = t2.user_id and t.hits = t2.max_hits

    这样?
    akira
        5
    akira  
       Oct 21, 2016   ❤️ 1
    @kfll
    select t.* from (select user_id, max(hits) as max_hits from t group by user_id) t2 left join t on t.user_id = t2.user_id and t.hits = t2.max_hits

    order by t.max_hits desc
    limit 3
    neoblackcap
        6
    neoblackcap  
       Oct 21, 2016
    MySQL 没有 windows 函数,无法实现你想要的效果,若是仅仅选取 user_id 跟 hits 两个 field 倒是可以做到
    Powered
        7
    Powered  
       Oct 21, 2016   ❤️ 1
    @akira

    select t.* from (select user_id, max(hits) as max_hits from t group by user_id) t2 left join t on t.user_id = t2.user_id and t.hits = t2.max_hits

    order by t2.max_hits desc
    limit 3
    reus
        8
    reus  
       Oct 21, 2016   ❤️ 1
    如果支持 window functions ,就很简单,好像 MariaDB 支持? postgres 支持,所以很方便

    select * from (

    select
    *, row_number() over (patition by user_id order by hits desc) as r
    from table

    )
    where r = 1
    order by hits desc
    limit 8
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   797 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 22:14 · PVG 06:14 · LAX 15:14 · JFK 18:14
    ♥ Do have faith in what you're doing.