MySQL从列表中选择x个记录的数量

问题描述:

可能是有史以来最差的标题。我有3列MySQL从列表中选择x个记录的数量

id | name | type 
1 | John | 1 
2 | Sam | 1 
3 | Bob | 2 
4 | Joe | 2 
5 | Al | 3 
6 | Paul | 3 

,我需要选择3都是不同类型

随机的人的一个表中的有效产出将是

id | name | type 
1 | John | 1 
3 | Bob | 2 
6 | Paul | 3 

无效的输出将

id | name | type 
3 | Bob | 2 
5 | Al | 3 
6 | Paul | 3 

我想我能做的是

SELECT id, name, type FROM table WHERE type = 1 
UNION 
SELECT id, name, type FROM table WHERE type = 2 
UNION 
SELECT id, name, type FROM table WHERE type = 3 

但是这不是真的可能,因为这只是一个简单的例子,在真正的代码中,我有更多的列来选择和执行连接,如果我这样做,它将是可怕的不可维护的。有什么建议么?

这是一个使用变量的方法。据推测,你想每个类型的随机记录:

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

这似乎工作,但我真的可以受益,如果你能解释它背后的想法,因为它看起来对我来说太复杂了。 – 2015-02-08 16:37:27

+0

是啊,使用这个,没有人会理解你的SQL或可以修复错误。 :O – Umingo 2015-02-08 22:10:59

为什么不试试与群组。

select id,name,type from table group by type order by rand() limit 0,XXX 
+0

我无法使用group by,因为它会合并我执行的连接中的所有记录 – 2015-02-08 16:36:30

+0

实际上,上面的代码看起来是要走的路。如果您需要与其他人一起加入,请将此查询作为子表整合到主查询中。 – jwatkins 2015-02-08 17:43:51

+0

哦,你不需要限制条款 – jwatkins 2015-02-08 17:46:42