如何使用限制和某种分数选择随机行?

时间:2019-02-06 01:18:34

标签: php mysql

我必须在其中有几行的地方进行sql查询。它只在同一张表中。

结果(1行或更多行)必须是随机的,并且遵循从0到...(任何大数,例如5000)的点系统。

例如,从此数据转储中,我想随机选择X个名称并遵循这些点。

选择3行的结果可能是ID:

10、6和4

或6、10、4

如果是4行,结果将是:

10,6,4,9

OR

6,10,4,9

CREATE TABLE `draw` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`points` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `draw` (`id`, `name`, `points`) VALUES (1, 'a', '65');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (2, 'b', '5000');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (3, 'c', '900');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (4, 'd', '10');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (5, 'e', '1000');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (6, 'f', '0');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (7, 'g', '650');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (8, 'h', '600');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (9, 'i', 30');
INSERT INTO `draw` (`id`, `name`, `points`) VALUES (10, 'j', '0');

1 个答案:

答案 0 :(得分:2)

首先需要SELECT行基于点的行,然后将其用作子查询,然后以随机顺序从结果中进行选择。为了确保如果多个用户具有相同的分数,我们不会总是选择同一用户,我们还通过RAND() 之后 points来对子查询进行排序:

SELECT *
FROM (SELECT *
      FROM draw
      ORDER BY points, RAND()
      LIMIT 4) d
ORDER BY RAND()

输出:

id  name    points
9   i       30
10  j       0
6   f       0
4   d       10

Demo on dbfiddle