mysql如何按权重查询数据啊?

假设表a有一个字段b,b存的是权重,范围0-100吧,我想随机查一条记录,但是按权重给出数据,该如何写呢

阅读 9k
4 个回答

楼上的回答全都会错意了,题主意思是根据权重设定随机几率,例如 A 的权重为10,B 的权重为 5,这个时候随机出现 A 的几率要比出现 B 的几率高。


你可以试试这个备选方案。
就是先取出权重列表再去根据权重随机出来的那个权重值,根据权重值去库里再随机查。

/**
 * Roll
 */
if (!function_exists('roll')) {
    function roll($data, $key = 'weight')
    {
        $weight   = 0;
        $tempData = [];
        foreach ($data as $one) {
            $weight += $one[$key];
            for ($i = 0; $i < $one[$key]; $i++) {
                $tempData[] = $one;
            }
        }
        $use = rand(0, $weight - 1);

        return $tempData[$use];
    }
}

$data = [['weight' => 1],
         ['weight' => 3],
         ['weight' => 5],
         ['weight' => 7],
         ['weight' => 9]];

$result = roll($data)['weight'];
SELECT * FROM database WHERE id >= (
    (SELECT MAX(id) FROM database WHERE b = $result) - (SELECT MIN(id) FROM database WHERE b = $result)
) * RAND() + (SELECT MIN(id) FROM database WHERE b = $result) AND b = $result LIMIT 1

select * from a order by b desc

返回的结果集越前面的权重越高
比如

--------------
|b  | 其余字段|
--------------
|100| xxxxxxx|
--------------
|97| xxxxxxx|
--------------
|6 | xxxxxxx|
--------------
|5 | xxxxxxx|
-------------

如果数据不多的话select *from a order by rand() limit 1

只取一条数据你还排什么序… 只随机取一条就完了 楼上的就是 要取多条才需要排序sql套一层就好 select * from (select * from a order by rand() limit n) aa order by b desc;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题