如何获得group by
group_id的随机结果?
它类似于这样:Random order for group of rows in mysql
这是我小提琴:http://sqlfiddle.com/#!9/1c73d/3
不知道为什么它总是给我同样的结果。
CREATE TABLE job
(`job_id` int, `group_id` int, `user_id` int, `title` varchar(50), `description` varchar(55), `type` tinyint)
;
INSERT INTO job
(`job_id`, `group_id`, `user_id`, `title`, `description`,`type`)
VALUES
(1, 1, 100, 'Title 1', 'Text 1', 1),
(2, 1, 100, 'Title 2', 'Text 2', 1),
(3, 1, 200, 'Title 3', 'Text 3', 1),
(4, 1, 200, 'Title 4', 'Text 4', 1),
(5, 1, 300, 'Title 5', 'Text 5', 2),
(6, 1, 400, 'Title 6', 'Text 6', 1),
(7, 1, 200, 'Title 7', 'Text 7', 1);
质询:
select * from job
where type = 1
group by group_id
order by rand()
6条答案
按热度按时间qjp7pelc1#
您的查询违反了sql标准,因为您在选择列表中列出了未在group by子句中列出的列,这些列也不是聚合函数(如count())的主题。MySQL在某些sql模式设置下允许此功能。
但是,即使启用了此功能,MySQL仍具有restrictions on the data chosen from the non-aggregated fields:
MySQL扩展了GROUP BY的标准SQL用法,以便选择列表可以引用GROUP BY子句中未命名的非聚集列。这意味着前面的查询在MySQL中是法律的的。您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要是在每个组中每个未在GROUP BY中命名的非聚集列中的所有值都相同时有用。2服务器可以自由地从每个组中选择任何值,因此,除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响从每个组中选择值。选择值后将进行结果集排序,ORDER BY不会影响服务器在每个组中选择哪些值。
因此,不要使用group by,而是使用sorting和limit子句来限制输出:
另外请注意这种随机选择的方法是非常耗费资源的,因为MySQL必须先对整个结果集排序,而不使用任何索引。还有其他方法可以不使用
order by rand()
从表中随机选择数据。aiazj4mn2#
假设您需要
type = 1
下每个组中的一个随机记录:SQL小提琴演示
kdfy810k3#
试试看
未分组
或
vof42yt14#
这是因为
GROUP BY
合并了具有相同group_id
的行,所以您的查询只给您一行作为结果,所以,尽管有ORDER BY RAND()
,结果总是相同的。如果使用此函数,将得到一个随机结果,但不进行分组:
jjjwad0x5#
“排序依据”是关于您获得的所有结果。您将所有结果分组,因此它只返回第一个数据,因为只有一个组。如果您有多个组,它将返回每个组的第一个数据。
。
pes8fvy96#
兰德+行编号