【问题标题】:mysql order by query, trying to randomize results by pairs of char_lengthmysql按查询排序,尝试按char_length对随机化结果
【发布时间】:2010-08-23 19:47:51
【问题描述】:

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

几个无序广告的示意图:

_______________ __________________
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)

有什么想法吗?

谢谢, 以利

【问题讨论】:

    标签: mysql random sql-order-by


    【解决方案1】:

    这是一个非答案,但是

    我建议将此逻辑转移到客户端。使用高级语言比使用数据库更容易。

    【讨论】:

    • »这是一个无答案« – 那么评论呢?
    • 谢谢 p.,我试图将其保留在 SQL 中,因为我使用限制子句对结果进行分页,并且不想从表格中抓取所有广告。 -伊莱
    • 再次感谢 p.,您是对的。我必须在分类广告中包含图像,并且使用 JavaScript 在页面上排列元素比在服务器上预先计算布局要容易得多。
    【解决方案2】:

    如果它不必是随机的,只是看起来随机,你可以先构建按字符数排序的行,然后按 substring(3,1) 或其他东西排序。

    我也同意 p.campbell 的观点,如果不在数据库中这样做会容易得多。

    【讨论】:

    • 我同意您也可以使用奇数/偶数计数器功能,提供奇数/偶数作为主要排序参数,然后按 rand 排序。这样你也可以做多个列。模算术会派上用场。
    【解决方案3】:

    这个呢:

    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是你的两个列,你也可以做更多),然后随机化每一列中的结果.

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

    【讨论】:

    • 感谢乔,您让我走上了正轨。找到后我会发布解决方案。
    • 我最终使用 JavaScript 来随机化和排列页面上的分类广告。所以虽然上面的查询很有用,但我最终没有使用它。我需要将图像与分类一起包括在内,并且更容易在一个
      中输出所有内容,在页面加载后将该
      的高度除以三,然后将分类和图像移动到单独的列中。显然,这是解决这个问题的一种完全荒谬的方法。但它奏效了。
    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多