【问题标题】:MYSQL query for first 40 records and else recordsMYSQL查询前40条记录和其他记录
【发布时间】:2019-06-13 12:29:39
【问题描述】:

我有一个表名“tbl_featured_professional”,其中字段是:

id,
user_id,
ranking and 
score,
createdDate 

我想要的是前 40 条记录按排名排序(这是唯一的),40 条之后的所有其他记录按分数排序。我想从 mysql 而不是 PHP 来做。我怎样才能做到这一点?谢谢。

【问题讨论】:

    标签: mysql sql limit offset


    【解决方案1】:

    检查我的解决方案

    select * from 
    (
      select * from tbl_featured_professional
      order by ranking
      limit 40
    )
    union all
    select * from 
    (
      select * from tbl_featured_professional
      order by score
      limit 9999999 offset 40
    )
    

    【讨论】:

    • 查询第二部分的offset 40是score排序时的偏移量,可能与ranking排序的前40个不同
    • 我无法理解。它是limit 9999999 offset 40。你认为问题是什么?
    • 第二个查询中的偏移量将基于该查询的 order by,因此它只会返回按分数排序的第 40 行的行。第一个查询返回按排名排序的前 40 行。所以按分数和排名排序的行可能有不同的顺序。
    • 我还要说 检查我的解决方案 并不能很好地解释您的答案。
    【解决方案2】:

    与UNION ALL 和NOT IN 一起使用2 个子查询应该适合您。 第一个查询将选择由ranking 排序的 40 行,带有子查询的第二个查询将选择所有其他行除了第一个子查询和排序已经选择的前 40 行由score 提供。 UNION ALL 子句将这 2 个子查询记录合并为一个集合。希望这会有所帮助并且可以理解:) 现在。

     SELECT * FROM tbl_featured_professional ORDER BY ranking LIMIT 40
     UNION ALL
     SELECT * FROM tbl_featured_professional WHERE id NOT IN (SELECT * FROM tbl_featured_professional ORDER BY ranking LIMIT 40) 
     ORDER BY score
    

    【讨论】:

    • @NigelRen 先生,刚刚添加了一些解释。希望现在可以理解了:)
    【解决方案3】:

    使用 2 个子查询和UNION。
    第一名获得ranking订购的前40名
    第二个按score对剩余行重新排序:

    SELECT * 
    FROM tbl_featured_professional
    ORDER BY ranking
    LIMIT 40
    UNION ALL
    SELECT * FROM (
      SELECT * FROM (
        SELECT * FROM tbl_featured_professional
        ORDER BY ranking
        LIMIT 40, 18446744073709551615
      )
      ORDER BY score
    )
    

    18446744073709551615 = 2^64 - 1,见this。

    【讨论】:

      【解决方案4】:

      如果排名——顾名思义——是一个从 1 开始并递增的数字,那么:

      select fp.*
      from tbl_featured_professional fp
      order by (fp.ranking <= 40) desc,
               (case when fp.ranking <= 40 then ranking end),
               score;
      

      【讨论】:

        猜你喜欢
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        相关资源
        最近更新 更多