2016-06-28 90 views
0

如何获得随机结果group by group_id?MySQL随机结果组按订单按

其类似这样的: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() 
+0

你的结果总是一行。所以你可以无论如何订购它 - 每当第一个 –

+1

这是你的要求:“从每个组获得随机记录? – 1000111

回答

0

假设你想type = 1下,从每一组中随机记录:

SELECT 
* 
FROM 
(
    SELECT 
     * 
    FROM job 
    WHERE type = 1 
    ORDER BY RAND() 
) AS t 
GROUP BY t.group_id; 

SQL FIDDLE DEMO

+0

该解决方案仍然违反SQL标准,可以在不使用子查询的情况下解决问题。 – Shadow

1

尝试

SELECT *,COUNT(*) totalCount 
FROM (SELECT * FROM job WHERE type = 1 ORDER BY RAND()) as temp 
GROUP BY group_id 

不进行分组

SELECT * FROM job 
WHERE type = 1 
ORDER BY rand() 
LIMIT 1 

SELECT * FROM job 
WHERE type = 1 
ORDER BY rand() 
0

这是因为GROUP BY合并行与相同的group_id,所以你的查询只给你一行作为结果,所以,尽管ORDER BY RAND()结果总是相同的。

如果你使用这个,你将有一个随机的结果,但是,不进行分组:

SELECT * 
FROM job 
WHERE type = 1 
ORDER BY RAND() 
LIMIT 1 
0

“订单由”是所有你得到的结果。您将所有结果进行分组,因为它只返回第一个数据,因为只有一个组。如果您有多个组,它将返回每个组的第一个数据。

select * from (
SELECT * from job order by rand()) tbl 
group by group_id ; 

3

您所查询的是对SQL标准,因为你列出你不要在选择列表列在group by子句中列表,也不是聚合函数的主题,例如count()。 MySQL在某些sql模式设置下允许此功能。

然而,即使启用此功能,MySQL有restrictions on the data chosen from the non-aggregated fields

的MySQL扩展了标准SQL使用GROUP BY的,这样的选择列表可参考在GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这非常有用,因为每个未在GROUP BY中命名的非聚合列中的所有值对于每个组都是相同的。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选值是不确定的。 此外,每个组的值的选择不能通过添加ORDER BY子句来影响。结果集排序在选择值后发生,并且ORDER BY不会影响服务器选择的每个组中的哪些值。

因此,而不是使用GROUP BY,使用排序和限制条款来限制输出:

select * from job 
    where type = 1 
    order by rand() 
    limit 1 

请注意,这个随机选择方法是非常耗费资源,因为MySQL会首先排序整个结果集而不使用任何索引。还有其他方法可以在不使用order by rand()的情况下从表中随机选择数据。

+0

你如何建议最好的方式来做到这一点:)?我想根据group_id随机获得结果,而不会限制其结果。 – tonoslfx