порядок mysql по запросу, пытаясь рандомизировать результаты по парам char_length

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

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

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

Любые идеи?

Спасибо, Эли


person Eli    schedule 23.08.2010    source источник


Ответы (3)


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

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

person p.campbell    schedule 23.08.2010
comment
»Это не ответ« — А как насчет комментария? - person Joey; 24.08.2010
comment
Спасибо, с., я пытаюсь сохранить это в SQL, потому что я использую предложение limit для разбиения результатов на страницы и не хочу захватывать все объявления из таблицы. -Эли - person Eli; 24.08.2010
comment
Еще раз спасибо п., вы были правы. Мне пришлось включать изображения вместе с объявлениями, и было намного проще использовать JavaScript для размещения элементов на странице, чем предварительно вычислить макет на сервере. - person Eli; 15.09.2011

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

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

person 182764125216    schedule 23.08.2010
comment
я согласен, что вы также можете использовать функцию счетчика нечетных/четных, указать нечетные/четные в качестве основного аргумента сортировки, а затем упорядочить по ранду. таким образом вы также можете сделать несколько столбцов. пригодилась бы арифметика по модулю. - person The Surrican; 23.08.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 очень и очень медленная. вы должны использовать какую-то оптимизированную версию, и вы должны добавить свои условия ограничения

person The Surrican    schedule 23.08.2010
comment
Спасибо, Джо, ты меня на правильном пути. Я опубликую решение, как только получу его. - person Eli; 24.08.2010
comment
В итоге я использовал JavaScript для рандомизации и размещения объявлений на странице. Поэтому, хотя приведенный выше запрос был полезен, я не стал его использовать. Мне нужно было включать изображения вместе с объявлениями, и было проще вывести все в один ‹div›, разделить высоту этого ‹div› на три после загрузки страницы, а затем переместить объявления и изображения в отдельные столбцы. Очевидно, это был совершенно нелепый способ решить эту проблему. Но это сработало. - person Eli; 15.09.2011