mysql按查询顺序,尝试通过char_length对随机化结果

时间:2010-08-23 19:47:52

标签: mysql random sql-order-by

我正在努力在表格行中显示分类广告页面。我试图解决的问题是以减少页面空白量的方式排列广告,同时保持随机顺序。

一些无序广告的图表:

_______________ __________________
ad text here.  |  another ad here
this ad has    |  (2)              
more text than | [ unwanted 
that ad. (1)   |   white-space ]
_______________|__________________

我想要做的是按char_length排序结果,还要将结果随机分组为2或3,或其他任何组合。

我现在的查询是:SELECT * FROM ads ORDER BY CHAR_LENGTH(adtext)limit $ page,$ ads_per_page(使用PHP)

这给我的结果看起来像:

_______________ ___________________
short ad. (1)  | another short ad. (2)
_______________|___________________
ad that's a (3)| another little
little longer. | longer ad. (4)
_______________|___________________
ads keep (5)   | this ad has the 
getting longer | most text out of
in char_length | all the ads... (6)

这对于减少空白区域非常有用,但我仍然需要将这些结果随机化。在MySQL中是否有可能将这些结果随机化为2组,3组或其他组?

换句话说,有什么能给我带来如下结果:

    _______________ ___________________
    ads keep  (1)  | this ad has the 
    getting longer | most text out of
    in char_length | all the ads... (2)
    _______________|___________________
    short ad. (3)  | another short ad. (4)
    _______________|___________________
    ad that's a (5)| another little
    little longer. | longer ad. (6)

有什么想法吗?

谢谢, 利

3 个答案:

答案 0 :(得分:1)

这是一个非答案,但是

我建议将此逻辑移至客户端。使用高级语言比在数据库中使用它会更容易。

答案 1 :(得分:0)

如果它不必是随机的,只需看起来随机,您可以先构建按字符排序的行,然后按子串(3,1)或其他顺序排序。

我也同意p.campbell,这在数据库中更容易实现。

答案 2 :(得分:0)

怎么样:

set @N = 0;
SELECT * FROM (
SELECT @N := @N +1 AS number,id,text FROM ads ORDER BY CHAR_LENGTH(text) limit 100 
) as ads ORDER BY (case when ads.number % 2 = 0 then 1 else 0 end) , RAND() 

首先选择按字段长度排序的所有内容,添加一个计数器。 然后在第二个查询中,哪个文本通过一个接一个地循环进入哪个列,这就是第一个排序标准(模2是你的两个columsn,你可以做更多)然后随机化每列中的结果

请注意,mysql rand函数非常非常慢。你应该使用一些优化的版本,你必须添加你的限制条件