Как вывести пять случайных строк из одной категории?

235
26 ноября 2016, 20:10

Есть таблица с полями id, name, hit.
В ней 100 записей.
5 из них - hit = 1

Как правильно вывести в такой сортировке: В первой десятке всегда должны быть 5 товаров с hit = 1, перемешены случайно. Далее, остальные товары Random

Answer 1
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 хитовых и не хитовых), а дальше все остальные.

Answer 2
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
READ ALSO
OpenCart, где править калькулятор цен товаров?

OpenCart, где править калькулятор цен товаров?

Здравствуйте, девелоперы! На опенкарт, дописываю свой модуль, делаю ручное управление цен, по этому дописовал и переписывал валюту, но калькулятор,...

262
Почему (65=&#39;65ae3ee2-aeb2-427f-8381-56db91b94363&#39;) -&gt; TRUE?

Почему (65='65ae3ee2-aeb2-427f-8381-56db91b94363') -> TRUE?

Запрос SELECT * FROM families WHERE id = '65ae3ee2-aeb2-427f-8381-56db91b94363' OR fam_code = '65ae3ee2-aeb2-427f-8381-56db91b94363' возвращает две записи:

218