需求:
我有一个文章数据库,我想从数据库里随机调出数据,生成一个自定义的云标签。
我想随机从数据库掉出40条记录,star = 5,star = 4,star = 3,star = 2,的各10条。
且每条记录的auther不重复,即40条记录有40个不同的auther。描述:
数据库名: article
数据库表列:  id|title|detail|star|date|auther
其中star列,一共有五种,(1,2,3,4,5)。
数据库量70-80万条。原始语句:(SELECT * FROM article WHERE star = `5` ORDER BY RAND() LIMIT 10) 
UNION 
(SELECT * FROM article WHERE star = `4` ORDER BY RAND() LIMIT 10)
UNION 
(SELECT * FROM article WHERE star = `3` ORDER BY RAND() LIMIT 10) 
UNION 
(SELECT * FROM article WHERE star = `2` ORDER BY RAND() LIMIT 10) 
LIMIT 40
 问题:
1.如何限制40条记录40个不同的auther?
2.如何对SQL语句进行优化?补充:
ORDER BY RAND()似乎速度很慢,而且总是RAND出数据库里前几条记录来。
我的数据库量有几十万,最好调出记录可以分散型分布。鸣谢:
谢谢大家的帮助。

解决方案 »

  1.   

    (SELECT * FROM article a WHERE star = `5` and article.auther != a.auther RAND(10)) 
    UNION 
    (SELECT * FROM article b WHERE star = `4` and article.auther != b.auther RAND(10))
    UNION 
    (SELECT * FROM article c WHERE star = `3` and article.auther != c.auther RAND(10)) 
    UNION 
    (SELECT * FROM article d WHERE star = `2` and article.auther != d.auther RAND(10)) 
      

  2.   

    这个很难用一普通SQL语句来实现,因为存在递归。 需要通过存储过程,或者直接在程序中实现。
      

  3.   

    1楼答案先顶一下,第一个问题解决了。不过rand()出来的数据,还是集中在数据库表的前几百条里。