2012-06-24 2 views
2

У меня есть эта таблица services, с данными следующим образом:Выберите п случайных групп п строк

service_id bepro_id service_name 
     1 1 Virtuales 
     2 2 Logos1 
     3 3 Diseño C 
     4 1 Formatos A3 
     203 77 Dasdad 
     6 2 Publi 
     8 4 edificios Vi 
     9 3 Maquillaje D 
     10 7 Servicio 10 Serv 
     11 4 servicio 11 tittle 
     14 3 Lorem ipsum dol 
     15 30 servicio 15 title 
     16 4 Titulo TituloTitulo 
     17 8 servicio 17 title ñ 
     19 11 Retoques digital 
     20 4 servicio 20 title 
     26 5 service 26 title 
     27 7 servicio 27 tittle 
     183 3 Excepteur sint occaecat 
     188 3 Duis aute irure dolor 
     185 3 Cillum dolore eu fugiat 
     186 3 Eserunt mollit anim i 
     190 3 Lorem ipsum dolor 
     191 3 general para ed 
     192 3 Ingenieria 
     193 3 letras 
     194 2 bocetos 
     196 60 Retoque fotografico 
     199 60 Maquetacion de 
     198 28 Revistas en General 

Хочет выбрать один из 8 различных случайных значений в bepro_id 1 до 8 на каждые значения (график 1, Maximun 8) каждый bepro_id.

Я имею в виду максимум 64 строки или минимум 8 строк. Затем я должен ПРИСОЕДИНИТЬСЯ с табличными «пользователями», где services.bepro_id = users.users_id.

Это выбирает только одну случайную строку для каждого значения (мне нужно min 1 max 8 значений для каждого значения) ниже @Andomar помогает мне много, но, похоже, не работает, и он выглядит сложным для того, что это такое, только так я мог бы сделать ?:

SELECT * FROM `services` GROUP BY bepro_id ORDER BY RAND() LIMIT 8 

Спасибо заранее

+0

@mouters сделано (мин) – Mik

ответ

2

Вы можете использовать переменный трюк MySQL, чтобы маркировать каждую строку с номером строки. inner join может использоваться для ограничения результата на N bepro. В приведенном ниже примере приведены 1-2 случайные службы для 3 случайных bepro. Это должно быть легко изменить эти значения.

Это то, что мне нужно поблагодарить @Andomar:

select * 
from (
     select distinct bepro_id 
     from services 
     order by 
       rand() 
     limit 8 -- Eight random bepro_id's 
     ) bepro 
join (
     select if(@last_bepro = bepro_id, @rn := @rn + 1, @rn := 1) as rn 
     ,  (@last_bepro := bepro_id) 
     ,  service_id 
     ,  bepro_id 
     ,  service_name 
     from services 
     cross join 
       (select @rn := 0, @last_bepro := -1) r 
     order by 
       bepro_id 
     ) serv 
on  serv.bepro_id = bepro.bepro_id 
join users 
on  users.id = bepro.bepro.id 
where serv.rn <= 8 -- 8 services max , 1 min per bepro_id 
order by 
     rand(); 

Live example at SQL Fiddle.

+0

Сейчас запрос возвращает 1-8 услуги. Если вы хотите, чтобы 8 сервисов всегда, замените 'floor (1 + (rand() * 2))' на '8'. Вы можете добавить другое соединение непосредственно перед предложением 'where'. – Andomar

+0

В любом случае это случайный случай. Вам нужно будет выбрать bepro с 8 + услугами, а затем бросить 8 на 1-8, чтобы вернуть все 8. Если вы всегда хотите 8, замените «пол (1 + (rand() * 2))» с помощью «8 "(удаление пола и rand целиком) – Andomar

+0

Затем замените' floor (1 + (rand() * 2)) 'с' 8', как я уже дважды предлагал в комментариях выше;) – Andomar

Смежные вопросы