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

bepro_id各値 (最小 1、最大 8) ごとに 1 から 8 の 8 つの異なるランダム値から選択したいと考えていますbepro_id

最大 64 行または最小 8 行を意味します。次に、services.bepro_id=users.users_id のテーブル「users」と JOIN する必要があります。

これは、値ごとにランダムな行を1つだけ選択します(各値に最小1最大8の値が必要です) @Andomarの下で非常に役立ちますが、機能していないようで、複雑に見えます。行う?:

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

前もって感謝します

4

1 に答える 1

2

MySQL 変数トリックを使用して、各行に行番号でラベルを付けることができます。Aninner joinを使用して、結果を N bepro に制限できます。以下の例では、3 つのランダムな bepro に対して 1 ~ 2 つのランダムなサービスが返されます。これらの値は簡単に変更できるはずです。

これは私が@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();

SQL Fiddle での実例。

于 2012-06-24T19:16:07.863 に答える