MySQL:为列的每个值选择几行

时间:2014-03-12 17:42:29

标签: mysql sql sample

Here's a fiddle

我有一个看起来像这样的简单表:

USER_NAME   STATUS
------------------
Paul        1
John        4
Brad        1
Simon       1
Jack        4

我有10种不同的状态和大约2000行(用户)。

我想从生产数据库中的每个状态导出一小部分行样本。然后我将在我的开发数据库中导入它们以运行测试

我想要一个查询,为status字段的每个值选择一些(比如3个)行

  • 3位状态为1的用户
  • 3位状态为2的用户
  • 3位状态为3的用户
  • ...

我怎么能实现这一目标?我是否必须在STATUS上进行循环并使用LIMIT?

非常感谢!

编辑:为清晰起见而编辑

4 个答案:

答案 0 :(得分:1)

您可以针对单个状态尝试此查询,您可以通过更改数字来扩展它...

SELECT * FROM tbl_name JOIN users ON ( users.Status = status.Id ) WHERE status.Id = 1 GROUP BY status LIMIT 3

答案 1 :(得分:1)

对于此大小的数据,最简单的方法是使用union all

(select t.* from table t where status = 1 order by rand() limit 3)
union all
(select t.* from table t where status = 2 order by rand() limit 3)
union all
. . .
union all
(select t.* from table t where status = 10 order by rand() limit 3)

还有其他方法可以表现得更好。但是这对你拥有的数据量来说应该是非常合理的。

答案 2 :(得分:0)

尝试此查询

SELECT users FROM table WHERE status = max(status)ORDER status LIMIT BY 3

答案 3 :(得分:0)

取自here

SELECT a.user_name, a.status
FROM table AS a
LEFT JOIN table AS b
    ON a.status = b.status
    AND a.created_at <= b.created_at
GROUP BY a.id
HAVING count(*) <= 3
ORDER BY a.status

在MySQL 5.5上测试