这是表结构,它仅包含以下两行:
--------------------------
|id | item | priority |
--------------------------
|1 | item1 | 20 |
--------------------------
|2 | item2 | 30 |
--------------------------
我必须在表上写一个查询,以获取这2行中的任何一行,或者按机会百分比获取任何内容。
20%的几率获得item1
30%的几率获得item2
50%的机会一无所获
答案 0 :(得分:1)
以下内容适用于MySQL
,MariaDB
和MS SQL Server
。
SELECT id, item, priority
FROM (
SELECT rand() * 100 as rnd
) r
INNER JOIN (
SELECT *, (SELECT COALESCE(SUM(priority), 0) FROM my_table WHERE id < t.id) as range_start
FROM my_table t
) mt
ON r.rnd between mt.range_start and (mt.priority + mt.range_start);
PostgreSQL
将rand()
替换为random()
。
SQLite
将rand() * 100
替换为ABS(RANDOM() % 100)
。
Oracle
将SELECT rand() * 100 as rnd
替换为SELECT dbms_random.value() * 100 as rnd FROM DUAL
。
答案 1 :(得分:0)
使用MySQL-8.0 + / MariaDB-10.2 +窗口函数:
SELECT item
FROM
(SELECT item,
SUM(priority) OVER (
ORDER BY id) AS cum_prob
FROM my_table) AS b
WHERE cum_prob >= RAND()*100
ORDER BY cum_prob
LIMIT 1
ref:fiddle