MySQL заказ по запросу, пытаясь рандомизировать результаты по парам char_length - PullRequest
3 голосов
/ 23 августа 2010

Я работаю над отображением страницы объявлений в строках таблицы.Проблема, которую я пытаюсь решить, состоит в том, чтобы разместить рекламу таким образом, чтобы уменьшить количество пустого пространства на странице при сохранении случайного порядка.

Диаграмма того, что пара неупорядоченных объявленийвыглядит так:

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

Я бы хотел упорядочить результаты по char_length, а также рандомизировать результаты в группы по 2, 3 или как угодно.

ЗапросУ меня сейчас есть: ВЫБРАТЬ * ОТ РЕКЛАМЫ ПО ЗАКАЗУ CHAR_LENGTH (adtext) лимит $ 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 ]

1 голос
/ 23 августа 2010

Это не ответ, но

Я бы предложил перенести эту логику на клиента. С языками высокого уровня вам будет намного легче, чем в вашей базе данных.

0 голосов
/ 23 августа 2010

что об этом:

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 очень и очень медленная.Вы должны использовать некоторую оптимизированную версию и вам нужно добавить свои условия ограничения

0 голосов
/ 23 августа 2010

если оно не должно быть случайным, просто посмотрите случайным образом, вы можете сначала построить строки, упорядоченные по числу символов, а затем упорядочить строки по подстроке (3,1) или что-то в этом роде.

также я согласен с p.campbell, это было бы гораздо проще сделать не в базе данных.

...