Mysql->;兰德之后的集团()
我在Mysql中有下表Mysql->;兰德之后的集团(),mysql,random,Mysql,Random,我在Mysql中有下表 Name Age Group 我想随机化这些行,但它们仍应按Group列分组。 对于exmaple,我希望我的结果看起来像这样 Name Age Group 我应该使用什么查询来获得此结果?整个表格应随机分组,然后按“分组”列分组。先进行随机分组,然后按列组排序 select Name, Age, Group from ( select * FROM yourtable order by RAND() ) t order by Gr
Name Age Group
我想随机化这些行,但它们仍应按Group列分组。 对于exmaple,我希望我的结果看起来像这样
Name Age Group
我应该使用什么查询来获得此结果?整个表格应随机分组,然后按“分组”列分组。先进行随机分组,然后按列组排序
select Name, Age, Group
from (
select *
FROM yourtable
order by RAND()
) t
order by Group
您在问题中描述为分组的内容更准确地描述为排序。在谈论SQL数据库时,这是一个特别的问题,其中“组”的含义完全不同,并决定聚合操作的范围 事实上,“group”在SQL中是一个保留字,所以尽管mysql和其他一些SQL数据库可以解决这个问题,但作为属性名,它是一个糟糕的选择
SELECT *
FROM yourtable
ORDER BY `group`
使用随机值也有很多语义混乱。一个真正的随机数在每次被检索时都会有不同的值,这使得任何排序都不可能(而且数据库做了很多排序,这通常是用户看不见的)。只要实现使用一个有限时间算法,比如快速排序,这应该不是问题,但是冒泡排序永远不会完成,合并排序可能会非常混乱
也有一定程度的随机性。生成随机数有不同的算法。对于加密来说,它比随机数均匀分布和完全不可预测更重要-通常这些会使用硬件事件(有时甚至是专用硬件),但我不认为您会需要它。但是您是否希望在调用之间可以重复排序
SELECT *
FROM yourtable
ORDER BY `group`, RAND()
…每次将给出不同的结果
奥托
…将给出始终按相同顺序排序的结果。当
SELECT
FROM yourtable
ORDER BY `group`, MD5(CONCAT(DATE(), age, name, `group`))
…将在不同的日子给出不同的结果。尝试以下方法:
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 |
+-------+-----+----------+
SELECT * FROM table order by Group,rand()
按组排序
?请注意,组是一个保留字,作为列/表标识符是一个糟糕的选择。谁投票支持这种东西?内部排序是冗余的。子查询是冗余的,并且有未加引号的保留字。要求是“除了列组之外,整个表都应该随机”。请你自己也试试。在我发布任何东西之前,先在sqlfiddle中测试和工作。也许我们对“工作”有不同的定义。这就是被接受的答案。谢谢!这对我帮助很大谢谢你!通过组从您的表顺序中选择*,RAND()
SELECT
FROM yourtable
ORDER BY `group`, MD5(CONCAT(DATE(), age, name, `group`))
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 |
+-------+-----+----------+
SELECT * FROM table order by Group,rand()