2016-06-28 92 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