Есть таблица с полями id, name, hit
.
В ней 100 записей.
5 из них - hit = 1
Как правильно вывести в такой сортировке: В первой десятке всегда должны быть 5 товаров с hit = 1
, перемешены случайно. Далее, остальные товары Random
select *
from (
select A.*,@nohit:=if(hit<>1,@nohit+1,0),@cnt:=if(@nohit=1,1,@cnt+1) num
from (
select *
from table
order by hit=1 desc, rand()
) A, (select @cnt:=0,@nohit:=0) B
) A
order by num<=5 desc, rand()
Здесь сначала все hit=1 ставятся в начале и все записи сортируются в случайном порядке. Далее в этом наборе hit=1 и hit<>1 нумеруются подряд, отдельно, начиная с 1. Т.е. записи hit=1 с номерами 1,2,3,... и точно так же hit<>1 1,2,3,... Этот набор мы сортируем еще раз, на этот раз в начале идут записи с номерами меньшими 5 (их как раз 10, по 5 хитовых и не хитовых), а дальше все остальные.
SELECT * FROM `om_table`
WHERE `hit` = 1
ORDER BY rand()
LIMIT 5
UNION
SELECT * FROM `om_table`
WHERE `hit` <> 1
ORDER BY rand()
LIMIT 5
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, девелоперы! На опенкарт, дописываю свой модуль, делаю ручное управление цен, по этому дописовал и переписывал валюту, но калькулятор,...
Запрос SELECT * FROM families WHERE id = '65ae3ee2-aeb2-427f-8381-56db91b94363' OR fam_code = '65ae3ee2-aeb2-427f-8381-56db91b94363' возвращает две записи: