按顺序排列的MySQL随机结果组

时间:2016-06-28 09:37:54

标签: php mysql group-by

如何在SimpleIDialog group_id上获得随机结果?

它的相似之处:Random order for group of rows in mysql

这是我的小提琴:http://sqlfiddle.com/#!9/1c73d/3

不确定为什么它总能给我相同的结果。

group by

查询:

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);

5 个答案:

答案 0 :(得分:3)

您的查询是针对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中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会发生结果集排序,ORDER BY不会影响服务器选择的每个组中的值。

因此,不使用group by,而是使用sorted和limit子句来限制输出:

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

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

答案 1 :(得分:1)

尝试

docx

没有分组

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

答案 2 :(得分:0)

那是因为GROUP BY将行与同一group_id合并,因此您的查询只会给您一行作为结果,因此,尽管ORDER BY RAND()结果总是相同的

如果你使用它,你会得到一个随机的结果,但是没有被分组:

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

答案 3 :(得分:0)

'order by'是关于你获得的所有结果。您正在对所有结果进行分组,因此它只返回第一个数据,因为只有一个组。如果您有多个组,它将返回每个组的第一个数据。

DECLARE @text NVARCHAR(100)
SET @text = 'This is a description.' + CHAR(13) + 'Updated description.'
SELECT @text

答案 4 :(得分:0)

假设您想要type = 1下的每个组中的一条随机记录:

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

SQL FIDDLE DEMO