假设我们有以下MySQL表:
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 |
我想在SQL上执行此操作,因为它比在Java程序上执行并使用HashMap<K,V>
然后再将值再次存储在另一个表中要快得多。
答案 0 :(得分: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;
这会为位置分配一个序号,然后选择第一个。
答案 1 :(得分: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;