【问题标题】:Sort records in random order for specific group of data using MySQL select query使用 MySQL 选择查询以随机顺序对特定数据组的记录进行排序
【发布时间】:2017-08-16 13:45:23
【问题描述】:

我有一个下面的数据库表结构:

Tablename : agency_mst
Fields:
id
name
is_premium
date_added

我想对数据进行排序,使 is_premium=1 的机构排在第一位,其余数据按 date_added desc 顺序排序。

而且 is_premium=1 记录也应该按随机顺序排序。所以第一组高级代理将有随机顺序。如何使用 MySQL Select 查询来做到这一点。

我已经部分构建了这个查询,但不确定如何过滤特定的数据集。以下是该查询:

SELECT * FROM agency_mst
ORDER BY is_premium DESC, date_added DESC

【问题讨论】:

    标签: mysql sql select sql-order-by


    【解决方案1】:

    怎么样

    SELECT * 
      FROM agency_mst
     ORDER BY IF(is_premium=1, RAND(), -1.0), date_added DESC
    

    这将对匹配的行使用随机排序,然后将其他行放在最后,并按日期排序。

    不过,请注意性能。任何变体中的ORDER BY RAND() 在多行表中都是臭名昭著的性能反模式。

    【讨论】:

    • 谢谢,刚刚尝试过,但是当只有一个代理机构的 is_premium=1 时,它不会排在首位。
    • 对您的查询稍作修改修复了此 IF(is_premium=1, RAND(), -1.0) DESC,谢谢 :)
    【解决方案2】:
    select t1.id,t1.name,t1.is_premium,t1.date_added from 
    (select (ROW_NUMBER() over (order by id))* cast(CRYPT_GEN_RANDOM(10) as int) RND,* from agency_mst) t1
    order by t1.RND
    

    【讨论】:

      【解决方案3】:
      选择 id, name, is_premium , date_added ,if(is_premium ,rand()*-15,0) as first_order 来自机构_mst ORDER BY first_order, date_added DESC

      检查这个使用 rand()*-15 你会得到 -velue 它首先显示并保持为 0 并且将按 date_added 排序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多