Помогите составить запрос

Sender

Новичок
Помогите составить запрос

В общем в поиске вроде ничего не нашел.

Проблема в следующем:
Есть набор позиций в БД принадлежащих разным фирмам. Необходимо выбрать записи таким образом, чтобы фирмы чередовались как можно чаще.
Допустим есть две фирмы.
Запись 1 - фирма 1
Запись 2 - фирма 2
Запись 3 - фирма 2
Запись 4 - фирма 2
Запись 5 - фирма 1
Необходимо чтобы результат запроса был следующим:
Запись 1 - фирма 1
Запись 2 - фирма 2
Запись 5 - фирма 1
Запись 3 - фирма 2
Запись 4 - фирма 2


Причем необходимо в будущем учесть постраничную навигацию. То есть в конце запроса необходим limit.

Что посоветуете? Может ссылки есть уже на готовые решения или статьи?


Была мысль формировать спектр названий фирм и выбирать по одной записи каждой фирмы с лимитом (i,1), где записи отсутствовали ничего не возвращалось. Но это уж слишком сложно (количество одиночных запросов=кол-во фирм*кол-во записей) получается, наверняка должно быть решение покрасивше.


Буду рад совету, помощи
 

Sender

Новичок
А ORDER BY RAND() не спасет гиганта мысли?
Нет :) Не пойдет.
Проблемы с постраничной навигацией возникают.

-~{}~ 18.01.05 13:08:

Неужто никто не сталкивался и мыслей нет?
 

chira

Новичок
если у тебя есть какое-то уникальное поле (id), то можешь поиграться с такой конструкцией:
ORDER BY RAND(unic_field + const)
если ходишь по страницам, то значение const на всех страницах должно быть одинаково.
 

alexhemp

Новичок
Sender

Задача противоречивая... либо случайно перемешать, либо LIMIT.

Могу предложить завести в таблице поле, его заполнить случайными числами (UPDATE table SET field=RAND())

Я еще делаю MD5(RAND()) - для большего разброса...

и потом уже - выводить ORDER BY field LIMIT

если хочется чтобы менялся порядок для КАЖДОГО посетителя, ну что-же - можно сделать таблицу "сессий". В ней хранить "порядок" записей и заполнять при старте этой "сессии" случайно для каждого.
 

Sender

Новичок
Спасибо про ответы. С рандомом были мысли, но хотелось бы четко организовать. Ведь сортировка не случайная, есть "алгоритм".

В общем пока с рандомом, но хотелось бы обсудить эту тему, должно же быть решение.
 

alexhemp

Новичок
Sender

Если есть алгоритм ты четко его опиши!

А не просто - "чередовались как можно чаще".
 

Azy

Новичок
Если я правильно понял суть, то делай так:
1. Создай поле ordr
2. Бери каждую фирму и для всех товаров проставь номера от 1-го до n (где n -количество товара)
3. просто сортируй по этому полю.
 

Sender

Новичок
Алгоритм? Хм, опишу словами:
Выбираем список фирм, попавших в запрос.
Идем по списку n раз,
n=количество записей, попавших в запрос.
формируя на каждый ход n запрос для каждой фирмы на выбор одной записи. Если записи для данной фирмы кончились - возвращаются пустые значения.

То если идти по примеру,
n=5
формируем запросы:
Первая запись первой фирмы
Первая запись второй фирмы
Вторая запись первой фирмы
Вторая запись второй фирмы
Третья запись первой фирмы
Третья запись второй фирмы
Четвертая запись первой фирмы
Четвертая запись второй фирмы
Пятая запись первой фирмы
Пятая запись второй фирмы

Результат:
Запись 1 - фирма 1
Запись 2 - фирма 2
Запись 5 - фирма 1
Запись 3 - фирма 2
Запись 4 - фирма 2
 

Apache_xp

Новичок
Здравствуйте!
Уточнение
1. По поводу алгоритма
если у нас есть 3 фирмы
фирма 1 - 10 записей
фирма 2 - 10 записей
фирма 3 - 20 записей
то по вашему алгоритму
1
2
3
....
3
3
3
3
Не совсем равномерно!
1
3
2
3
1
3
2
3
...
чуть чуть равномернее...
это ладно
Теперь по запросу
1.
Если количество фирм фиксированно, то действительно
заводим дополнитльное поле OrdRnd и при добавлении записи
заносим туда число МАХ(OrdRnd) + N (количество фирм) по этой фирме( максимум берется для записей только по этой фирме)
Если теперь при выборке мы упорядочиваем по этому полю то все ок(для твоего алгоритма)
понятно что с лимитом проблемм не возникнет
2.
Если количество фирм меняестя!
а. Как в первом пункте только переписываешь ее каждый раз при добавлении новой фирмы(хреново)

Если количство фирм зараннее меньше некоторого М
то вместо И можно использовать его

На самом деле этого в полне хватит (если вдруг количество фирм станет слишком большим то можно и переписать на другое И)
 

Sender

Новичок
На одном из форумов посоветовали:

select (
select count(*)
from list_firm as test_2
where test_2.id_test <= test_1.id_test and test_2.firma=test_1.firma) as rank,
test_1.id_test,
test_1.firma
from list_firm as test_1
order by rank,firma

На малых количествах записей работает на "ять". Но в таблице 550000 записей, виснет капитально запрос.

-~{}~ 19.01.05 09:37:

Apache_xp
Алгоритм я описал правильно по своему представлению :)

Такая задача предназначена для того, чтобы показать что в выводе учавствует большое количество фирм.


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

Wicked

Новичок
То если идти по примеру,
n=5
формируем запросы:
Первая запись первой фирмы
Первая запись второй фирмы
...
Пятая запись первой фирмы
Пятая запись второй фирмы
Можно в таблице записей завести поле NUM_IN_FIRM INT NOT NULL, в котором для N записей какой-то фирмы будут расставлены номера от 0 до N-1 (причем это условие нужно восстанавливать при удалении/добавлении новых записей). Заполнять его нужно на стадии добавления записей к фирмам значением[SQL]select MAX(`NUM_IN_FIRM`) + 1 from `RECORDS` where `FIRM_ID` = '$escaped_firm_id'[/SQL].
Тогда сам запрос выбора строится так:
[SQL]select * from `RECORDS` order by `NUM_IN_FIRM` asc, `FIRM_NUM` asc[/SQL]
 
Сверху