Mysql->兰德后的小组()

时间:2018-03-15 13:14:16

标签: mysql random

我在Mysql中有以下表格

Name  Age   Group
 abel    7      A
 joe     6      A
 Rick    7      A
 Diana   5      B
 Billy   6      B
 Pat     5      B

我想将这些行随机化,但它们仍应按“组”列进行分组。 对于exmaple,我希望我的结果看起来像这样。

 Name  Age   Group
 joe     6      A
 abel    7      A
 Rick    7      A
 Billy   6      B
 Pat     5      B
 Diana   5      B

我应该使用什么查询来获得此结果?整个表应该随机化,然后按“组”列分组。

4 个答案:

答案 0 :(得分:1)

您在问题中描述的内容,因为GROUPing更准确地描述为排序。在谈论SQL数据库时,这是一个特殊问题,其中" GROUP"意味着完全不同的东西,并确定聚合操作的范围。

确实" group"是SQL中的保留字,所以尽管mysql和其他一些SQL数据库可以解决这个问题,但它作为属性名称的选择很差。

SELECT *
FROM yourtable
ORDER BY `group`

使用随机值也会产生很多语义混淆。每次检索时,一个真正随机的数字将具有不同的值 - 这将使任何排序都不可能(并且数据库执行排序的批次,这通常对用户是不可见的)。只要实现使用有限时间算法(例如快速排序)不应该成为问题 - 但冒泡排序永远不会完成,并且合并排序可能会变得非常困惑。

还有随机性的。存在用于生成随机数的不同算法。对于加密来说,关键是随机数分布均匀且完全不可预测 - 通常这些将使用硬件事件(有时甚至是专用硬件),但我不希望你需要它。但是你想要在调用之间重复排序吗?

 SELECT *
 FROM yourtable
 ORDER BY `group`, RAND()

...每次都会给出不同的结果。

OTOH

SELECT
FROM yourtable
ORDER BY `group`, MD5(CONCAT(age, name, `group`))

...会使结果始终以相同的顺序排序。而

SELECT
FROM yourtable
ORDER BY `group`, MD5(CONCAT(DATE(), age, name, `group`))

...将在不同的日子给出不同的结果。

答案 1 :(得分:0)

先做随机,然后按列组排序。

<div class="geopoint-infowindow">
   <a [routerLink]="/users/${user.id}">${user.firstName} ${user.lastName}</a>
</div>

答案 2 :(得分:0)

DROP TABLE my_table;

CREATE TABLE my_table
(name VARCHAR(12) NOT NULL
,age INT NOT NULL
,my_group CHAR(1) NOT NULL
);

INSERT INTO my_table VALUES
('Abel',7,'A'),
('Joe',6,'A'),
('Rick',7,'A'),
('Diana',5,'B'),
('Billy',6,'B'),
('Pat',5,'B');

SELECT * FROM my_table ORDER BY my_group,RAND();
+-------+-----+----------+
| name  | age | my_group |
+-------+-----+----------+
| Joe   |   6 | A        |
| Abel  |   7 | A        |
| Rick  |   7 | A        |
| Pat   |   5 | B        |
| Diana |   5 | B        |
| Billy |   6 | B        |
+-------+-----+----------+

答案 3 :(得分:0)

试试这个:

SELECT * FROM table order by Group,rand()