SQL语句随机选择一行具有一定条件

时间:2014-05-22 15:57:50

标签: mysql sql

假设我们有以下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>然后再将值再次存储在另一个表中要快得多。

2 个答案:

答案 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;

SQL Fiddle demo