2014-05-22 35 views
0

假設我們有如下的MySQL表中的一行:SQL語句來隨機選擇具有一定的標準

ID | Name | Last_Name | Location | 
1 | Alex | Griff  | DT  | 
2 | John | Doe  | York  | 
3 | Pat | Benat  | DT  | 
4 | Jack | Darny  | DT  | 
5 | Duff | Hill  | York  | 

我想創建中隨機選擇一個排的每個位置的SQL語句,並將它們存儲在一個新表。

例如:

2 | John | Doe  | York  | 
3 | Pat | Benat  | DT  | 

OR

4 | Jack | Darny  | DT  | 
5 | Duff | Hill  | York  | 

我想,因爲它比做一個Java程序,並使用HashMap<K,V>,然後再次將值存儲快得多的SQL執行此在另一張桌子。

+0

看到這個問題 - http://stackoverflow.com/questions/249301/simple-random-samples-from- a-sql-database –

+0

@TomRon。 。 。問題是完全不同的,因爲這個問題是關於每個位置的隨機樣本,而不是整個隨機樣本。 –

回答

0

This page有解決方案。我只是修改了查詢到你的表定義如下:

SELECT tmp.ID, tmp.Name, tmp.Last_Name, tmp.Location 
FROM profiles 
LEFT JOIN (SELECT * FROM profiles ORDER BY RAND()) tmp ON (profiles.Location = tmp.Location) 
GROUP BY tmp.Location 
ORDER BY profiles.Location; 

SQL Fiddle demo

+0

此請求假定'tmp'的值全部來自同一記錄。實際上,MySQL文檔*特別警告:http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html。 –

0

如果你想爲每個位置隨機抽樣,你有幾個選項。我認爲最簡單的是一種可變的方法,如果你的桌子不是超級大的,那麼這種方法會很好。

select t.* 
from (select t.*, 
      @rn := if(@location = location, @rn + 1, 1) as rn, 
      @location := location 
     from table t cross join 
      (select @location := '', @rn := 0) vars 
     order by location, rand() 
    ) t 
where rn = 1; 

這會爲位置分配一個連續編號,然後選擇第一個位置。

+0

這是mysql嗎?看起來很複雜。 –

+0

@ user3620037。 。 。 (1)對我來說看起來並不複雜。 (2)你有一些複雜的要求。 –